当前位置:   article > 正文

有关栈的练习

有关栈的练习

栈练习1

给定一个栈(初始为空,元素类型为整数,且小于等于 109),只有两个操作:入栈和出栈。先给出这些操作,请输出最终栈的栈顶元素。
操作解释:
1 表示将一个数据元素入栈;
2 表示出栈。保证出栈的时候栈里数据不为空。

输入

第一行,一个数字 N,表示操作个数。1≤N≤10^5
其后 N 行,表示 N 个操作(如果是入栈则后面还会有一个入栈元素)。
具体见样例(输入保证栈空时不会出栈)。

输出

最终栈顶元素,若最终栈空,输出”impossible!”(不含引号)。

样例输入
  1. 3
  2. 1 2
  3. 1 9
  4. 2
样例输出
2
代码:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. stack<int>a;
  4. int n,x,y;
  5. int main(){
  6. cin>>n;
  7. for(int i=1;i<=n;i++){
  8. cin>>x>>y;
  9. if(x==2){
  10. a.pop();
  11. }
  12. else if(x==1){
  13. a.push(y);
  14. }
  15. }
  16. if(!a.empty())cout<<a.top();
  17. else cout<<"impossible!";
  18. return 0;
  19. }

 栈练习2

此题与相比栈练习1改了 2 处:1、加强了数据,2、不保证栈空时不会出栈。
给定一个栈(初始为空,元素类型为整数,且小于等于 109),只有两个操作:入栈和出栈。先给出这些操作,请输出最终栈的栈顶元素。
操作解释:
1 表示将一个元素入栈;
2 表示出栈。出栈的时候栈可能为空。

输入

第一行,一个数字 N,表示操作个数。1≤N≤105。
其后 N 行,表示 N 个操作(如果是入栈则后面还会有一个入栈元素)。
具体见样例(输入不保证栈空时不会出栈)。

输出

最终栈顶元素。若最终栈空,或每次栈空时有出栈操作,输出”impossible!”(不含引号)。

样例输入
  1. 3
  2. 1 2
  3. 2
  4. 2
样例输出
  1. impossible!
  2. impossible!
代码:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. long long n,a,b;
  4. stack<long long>s;
  5. int main(){
  6. cin>>n;
  7. for(int i=1;i<=n;i++)
  8. {
  9. cin>>a;
  10. if(a==1)
  11. {
  12. cin>>b;
  13. s.push(b);
  14. }
  15. if(a==2)
  16. {
  17. if(!s.empty())s.pop();
  18. else cout<<"impossible!"<<endl;
  19. }
  20. }
  21. if(!s.empty())cout<<s.top();
  22. else cout<<"impossible!";
  23. return 0;
  24. }

 栈练习3

比起栈练习1,本题加了另外一个操作,访问栈顶元素(编号 3,保证访问栈顶元素时或出栈时栈不为空),现在给出这 N 次操作,输出结果。

输入

第一行,一个数字 N,表示操作个数。1≤N≤105。
其后 N 行,表示 N 个操作:
1 入栈;入栈元素大小不会超过 109。
2 出栈;
3 访问栈顶。

输出

K行(K为中间询问的次数)每次的结果

样例输入
  1. 6
  2. 1 7
  3. 3
  4. 2
  5. 1 9
  6. 1 7
  7. 3
样例输出
  1. 7
  2. 7
代码:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. long long n,a,b;
  4. stack<long long>s;
  5. int main(){
  6. cin>>n;
  7. for(int i=1;i<=n;i++)
  8. {
  9. cin>>a;
  10. if(a==1)
  11. {
  12. cin>>b;
  13. s.push(b);
  14. }
  15. if(a==2)
  16. s.pop();
  17. if(a==3)
  18. cout<<s.top()<<endl;
  19. }
  20. return 0;
  21. }

栈练习4

比起栈练习3,本题不保证访问栈顶元素时或出栈时栈不为空,现在给出这 N 此操作,输出结果。

输入

第一行,一个数字 N,表示操作个数。1≤N≤105。
其后 N 行,表示 N 个操作:
1 入栈;入栈元素大小不会超过 109。
2 出栈;
3 访问栈顶。

输出

若干行每次的结果。
对于2操作。如果栈为空,每次操作输出 impossible!。
对于3操作。如果栈为空,每次操作输出 impossible!。如果栈不为空,输出对应的栈顶数据

样例输入
  1. 6
  2. 1 7
  3. 3
  4. 2
  5. 2
  6. 1 9
  7. 3
样例输出
  1. 7
  2. impossible!
  3. 9
 代码:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. long long n,a,b;
  4. stack<long long>s;
  5. int main(){
  6. cin>>n;
  7. for(int i=1;i<=n;i++)
  8. {
  9. cin>>a;
  10. if(a==1)
  11. {
  12. cin>>b;
  13. s.push(b);
  14. }
  15. if(a==2)
  16. {
  17. if(!s.empty())s.pop();
  18. else cout<<"impossible!"<<endl;
  19. }
  20. if(a==3)
  21. {
  22. if(!s.empty())cout<<s.top()<<endl;
  23. else cout<<"impossible!"<<endl;
  24. }
  25. }
  26. return 0;
  27. }

洗盘子

晨晨和涵涵将联手洗掉 N (1<= N <= 10,000) 个脏盘子。晨晨洗,涵涵来擦干它们。每个盘子有一个指 定的编号,范围 1..N。开始,所有盘子按顺序排列在栈中(只能竖着叠放盘子的盒子), 1 号盘子在顶端, N 号盘子在底端。 
晨晨会先洗一些盘子,然后放在洗过的盘子栈里(这样与原来的顺序刚好颠倒)。然后,或者她洗别 的盘子,或者涵涵擦干她已经洗好的部分或全部盘子,放在擦干的盘子栈里。这样直到所有盘子洗完擦干 后放置的顺序是什么?
 



 

输入

第一行:一个整数 N,表示盘子的数量。 
接下来若干行:每一行两个整数,第一个整数为 1 表示洗盘子,为 2 表示擦盘子,第二个整数表示盘子数量

输出

共 N 行:擦干后盘子从顶端到底端的顺序

样例输入
  1. 5
  2. 1 3
  3. 2 2
  4. 1 2
  5. 2 3
样例输出
  1. 1
  2. 4
  3. 5
  4. 2
  5. 3
代码:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. long long n,x,y,bj;
  4. stack<long long>a;
  5. stack<long long>b;
  6. stack<long long>c;
  7. int main(){
  8. cin>>n;
  9. for(int i=n;i>=1;i--)
  10. a.push(i);
  11. while(cin>>x>>y)
  12. {
  13. if(x==1)
  14. {
  15. while(y>0)
  16. {
  17. b.push(a.top());
  18. a.pop();
  19. y--;
  20. }
  21. }
  22. else
  23. {
  24. while(y>0)
  25. {
  26. c.push(b.top());
  27. b.pop();
  28. y--;
  29. bj++;
  30. }
  31. }
  32. if(bj==n)break;
  33. }
  34. while(!c.empty())
  35. {
  36. cout<<c.top()<<endl;
  37. c.pop();
  38. }
  39. return 0;
  40. }

 程序员输入问题

程序员输入程序出现差错时,可以采取以下的补救措施:按错了一个键时,可以补按一个退格符“#”,以表示前一个字符无效;发现当前一行有错,可以按一个退行符“@”,以表示“@”与前一个换行符之间的字符全部无效。

输入

输入一行字符,个数不超过100。

输出

输出一行字符,表示实际有效字符。

样例输入
          sdfosif@for (ii#=1,#; i<.#=8; i+++#);
样例输出
for (i=1; i<=8; i++);
提示

因为输入只有一行,所以题目所讲的遇到@退行符就是清空当前栈里面所有元素

代码:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. string s,s1;
  4. stack<char>a;
  5. int main(){
  6. getline(cin,s);
  7. for(int i=0;i<s.size();i++)
  8. {
  9. if(s[i]=='#')a.pop();
  10. if(s[i]=='@')
  11. {
  12. while(!a.empty())
  13. {
  14. a.pop();
  15. }
  16. }
  17. if(s[i]!='#'&&s[i]!='@')
  18. {
  19. a.push(s[i]);
  20. }
  21. }
  22. while(!a.empty())
  23. {
  24. s1=a.top()+s1;
  25. a.pop();
  26. }
  27. cout<<s1;
  28. return 0;
  29. }

表达式括号匹配

假设一个表达式有英文字母(小写)、运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”;否则返回“NO”。表达式长度小于255,左圆括号少于20个。

输入

一行数据,即表达式。

输出

一行,即“YES” 或“NO”。

样例输入
2*(x+y)/(1-x)@
样例输出
YES
代码:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. stack<char>a;
  4. int main()
  5. {
  6. char ch;
  7. cin>>ch;
  8. while(ch!='@')
  9. {
  10. if(ch=='(')a.push(ch);
  11. else if(ch==')' && a.empty())
  12. {
  13. cout<<"NO";
  14. return 0;
  15. }
  16. else if(ch==')')a.pop();
  17. cin>>ch;
  18. }
  19. if(a.empty())cout<<"YES";
  20. else cout<<"NO";
  21. return 0;
  22. }

 括弧匹配检验

假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([ ]())或[([ ][ ])]等为正确的匹配,[( ])或([ ]( )或 ( ( ) ) )均为错误的匹配。
现在的问题是,要求检验一个给定表达式中的括弧是否正确匹配?
输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出 “OK” ,不匹配就输出“Wrong”。输入一个字符串:[([][])],输出:OK。

输入

输入仅一行字符(字符个数小于255)。

输出

匹配就输出 “OK” ,不匹配就输出“Wrong”。

样例输入
[(])
样例输出
Wrong
代码:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int top;
  4. bool f;
  5. int main(){
  6. string s;
  7. char a[3000];
  8. cin>>s;
  9. int l=s.size(),n,m;
  10. for(int i=0;i<l;i++){
  11. if(s[i]=='('||s[i]==')')n++;
  12. if(s[i]=='['||s[i]==']')m++;
  13. if(s[i]=='('||s[i]=='[')a[++top]=s[i];
  14. if(s[i]==')'){
  15. if(a[top]=='(')top--;
  16. else{
  17. f=1;
  18. break;
  19. }
  20. }
  21. if(s[i]==']'){
  22. if(a[top]=='[')top--;
  23. else{
  24. f=1;
  25. break;
  26. }
  27. }
  28. }
  29. if(n%2==1||m%2==1){
  30. cout<<"Wrong";
  31. return 0;
  32. }
  33. if(f==1)cout<<"Wrong";
  34. else cout<<"OK";
  35. return 0;
  36. }

 符号匹配

假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([ ]())或[([ ][ ])]等为正确的匹配,[( ])或([ ]( )或 ( ( ) ) )均为错误的匹配。
现在的问题是,要求检验一个给定表达式中的括弧是否正确匹配?
输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出 “YES” ,不匹配就输出“NO”。输入一个字符串:[([][])],输出:YES。

输入

输入包括多组测试数据,每组数据是一个字符串,字符串只包含“()[]”等字符。

输出

对于每组数据输出“YES”表示当前字符串中的括号是匹配的,否则输出“NO”(不包括引号)

样例输入
  1. ()
  2. ([)]
样例输出
  1. YES
  2. NO
代码:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. string s;
  4. int main(){
  5. while(cin>>s){
  6. int top=0;
  7. bool f=0;
  8. char a[3000];
  9. for(int i=0;i<=2999;i++)a[i]=' ';
  10. int l=s.size(),n=0,m=0;
  11. for(int i=0;i<l;i++){
  12. if(s[i]=='('||s[i]==')')n++;
  13. if(s[i]=='['||s[i]==']')m++;
  14. if(s[i]=='('||s[i]=='[')a[++top]=s[i];
  15. if(s[i]==')'){
  16. if(a[top]=='(')top--;
  17. else{
  18. f=1;
  19. break;
  20. }
  21. }
  22. if(s[i]==']'){
  23. if(a[top]=='[')top--;
  24. else{
  25. f=1;
  26. break;
  27. }
  28. }
  29. }
  30. if(n%2==1||m%2==1){
  31. cout<<"NO\n";
  32. continue;
  33. }
  34. if(f==1)cout<<"NO\n";
  35. else cout<<"YES\n";
  36. }
  37. return 0;
  38. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/456822
推荐阅读
相关标签
  

闽ICP备14008679号