C++语法-数据类型-栈stack(答案+题目)

今天我给大家出一套C++语法-数据类型-栈stack考题

限时1小时,大家加油!!!

题目1:栈.选择题

单选题1

某个车站呈狭长形,宽度只能容下一台车,并且只有一个出入口。已知某时刻该车站状态为空,从 这一时刻开始的出入记录为:“进,出,进,进,进,出,出,进,进,进,出, 出”。假设车辆入站的 顺序为 1,2,3,...,则车辆出站的顺序为:

  •  A. 1, 2, 3, 4, 5 
  • B. 1, 4, 3, 7, 6 
  • C. 1, 4, 3, 7, 2

单选题2

设栈 S 和队列 Q 的初始状态为空,元素 e1,e2,e3,e4,e5,e6 依次通过栈 S,一个元素出栈后即进入队列 Q,若出队的顺序为 e2 ,e4 ,e3,e6 ,e5 ,e1 ,则栈 S 的容量至少应该为:

  •  A. 2 
  • B. 3 
  • C. 4 
  • D. 5

题目2:引例栈 

题目描述

现在输入一串非负整数,每个正整数 x 表示 push(x) 操作;每个 0 表示一个 pop() 操作,要求输出栈顶元素,如果这时栈是空的,就输出 -1。

输入格式

第 1 行: 1 个正整数 N 范围在 [1,100000]。

第 2 行: N 个非负整数,表示题目中所述的操作。

输出格式

一行,多个整数,表示题目中所述的操作的输出结果。

样例

输入数据 1

8
2 3 0 4 0 0 0 5

输出数据 1

3 4 2 -1

程序填空

#include<bits/stdc++.h>
using namespace std;
int n;
stack <int> a;
int main()
{
	cin>>n;
	int x;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&x);
		if(x==0)
		{
			if( 填空(1) >0)
			{
				printf("%d ", 填空(2) );
				填空(3) ;
			}
			else
				printf("-1 ");
		}
		else
			填空(4) ;
	}

	return 0;
}

填空(1) 

填空(2) 

填空(3) 

填空(4) 

题目3:栈引例表达式求值(noip2013普及) 

题目描述

给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。

输入格式

输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符 “+” 和乘法运算符 “*” ,且没有括号,所有参与运算的数字均为 0 到 2^31 -1 之间的整数。输入数据保证这一行只有 0~ 9、+、*这 2 种字符。

数据范围

对于 30% 的数据,0 ≤ 表达式中加法运算符和乘法运算符的总数 ≤ 100;

对于 80%的数据,0 ≤ 表达式中加法运算符和乘法运算符的总数 ≤ 1000;

对于 100%的数据,0 ≤ 表达式中加法运算符和乘法运算符的总数 ≤ 100000。

输出格式

输出只有一行,包含一个整数,表示这个表达式的值。 注意: 当答案长度多于 4 位 时,请只输出最后 4 位 , 前导 0 不输出。

样例

输入数据 1

1+1*3+4

输出数据 1

8

输入数据 2

1+1234567890*1

输出数据 2

7891

输入数据 3

1+1000000003*1

输出数据 3

4

样例解释

样例 1 计算的结果为 8,直接输出 8。

样例 2 计算的结果为 1234567891,输出后 4 位,即 7891。

样例 3 计算的结果为 1000000004,输出后 4 位,即 4。

程序填空

#include<bits/stdc++.h>
using namespace std;
stack <int> s;
int main()
{
	char c;
	int num,ans=0;

	cin>>num;
	num = num % 10000;
	填空(1) 

	while(cin>>c>>num)
	{
		if(c=='*')
		{
			num = 1ll* 填空(2) *num%10000;
			填空(3) ;
		}
		else
			num = num%10000;
		
		填空(4) ;
	}
	
	while(!s.empty())
	{
		ans += 填空(5) ;
		ans = ans%10000;
		填空(6) ;
	}

	printf("%d",ans);
	return 0;
}

填空(1) 

填空(2) 

填空(3) 

填空(4) 

填空(5) 

填空(6) 

题目4:应用栈

题目描述

现在输入一串非负整数,每个正整数 x 表示 push(x)操作;每个 0 表示一个 pop()操作,要求输出栈顶元素,如果这时栈是空的,就输出-1。

输入格式

第一行 1 个正整数 N 范围在[1,100000]。

第二行 N 个非负整数,表示题目中所述的操作。

输出格式

一行,多个整数,表示题目中所述的操作的输出结果。

样例

输入数据 1

8
2 3 0 4 0 0 0 5

输出数据 1

3 4 2 -1

题目1答案:

代码

'1': B
'2': B

题目2答案:

代码

'1': a.size()
'2': a.top()
'3': a.pop()
'4': a.push(x)

题目3答案: 

代码

'1': s.push(num)
'2': s.top()
'3': s.pop()
'4': s.push(num)
'5': s.top()
'6': s.pop()

题目4答案: 

代码

#include<bits/stdc++.h>
using namespace std;
int n;
stack <int> a;
int main()
{
	cin>>n;
	int x;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&x);
		if(x==0)
		{
			if( a.size() >0)
			{
				printf("%d ", a.top());
				a.pop() ;
			}
			else
				printf("-1 ");
		}
		else
			a.push(x);
	}

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值