当前位置:   article > 正文

ZISUOJ 数据结构-栈

ZISUOJ 数据结构-栈

题目列表:

问题 A: 数据结构-栈-括号匹配

思路:

        遇到左半边括号,将其入栈,遇到右半边括号,则先判断栈是否为空,若为空,则匹配失败,若不为空,则再判断栈顶元素是否是与之匹配的左半边括号,若不是,则匹配失败,一直匹配到栈空,如果栈空,则匹配成功,否则匹配失败

参考题解:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. stack<char> stk;
  4. string line;
  5. int main(){
  6. cin.tie(nullptr)->sync_with_stdio(false);
  7. getline(cin,line);
  8. for(auto c:line){
  9. if(c=='(') stk.push(c);
  10. else if(c==')'){
  11. if(stk.empty()){
  12. cout << "NO\n";
  13. return 0;
  14. }else{
  15. if(stk.top()=='(') stk.pop();
  16. }
  17. }
  18. }
  19. cout << (stk.empty()?"YES\n":"NO\n");
  20. return 0;
  21. }

问题 B: 数据结构-栈-车厢顺序

思路:

        这个题也不知道怎么说思路,反正是很经典的一个题,如果实在不懂,可以去查一查资料。

参考题解:
 

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. constexpr int MAXN = 1e3+5;
  4. int n,cnt = 1;
  5. array<int,MAXN> a;
  6. stack<int> stk;
  7. int main(){
  8. cin.tie(nullptr)->sync_with_stdio(false);
  9. cin >> n;
  10. for(int i = 0;i<n;i++) cin >> a[i];
  11. for(int i = 0;i<n;i++){
  12. while(cnt<=a[i]){
  13. stk.push(cnt++);
  14. }
  15. if(stk.top()==a[i]) stk.pop();
  16. else{
  17. cout << "NO\n";
  18. return 0;
  19. }
  20. }
  21. cout << "YES\n";
  22. return 0;
  23. }

问题 C: 数据结构-栈-括弧匹配检验

思路:

        跟第一题相似,注意括号对应匹配即可。

参考题解:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. stack<char> stk;
  4. string line;
  5. unordered_map<char,char> mp = {{'(',')'},{'[',']'}};
  6. int main(){
  7. cin.tie(nullptr)->sync_with_stdio(false);
  8. getline(cin,line);
  9. for(auto c:line){
  10. if(c=='('||c=='['){
  11. stk.push(c);
  12. }else if(c==')'||c==']'){
  13. if(stk.empty()){
  14. cout << "Wrong\n";
  15. return 0;
  16. }else{
  17. if(mp[stk.top()]==c) stk.pop();
  18. else{
  19. cout << "Wrong\n";
  20. return 0;
  21. }
  22. }
  23. }
  24. }
  25. cout << (stk.empty()?"OK\n":"Wrong\n");
  26. return 0;
  27. }

问题 D: 数据结构-栈-字符串匹配

 

思路:

        这个题相比上一题,不仅要匹配的数量更多,并且还要注意括号优先级的问题,我这里选择再加了一个哈希表来匹配优先级。

参考题解:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. stack<char> stk;
  4. string line;
  5. int n;
  6. unordered_map<char,char> mp = {{'<','>'},{'(',')'},{'[',']'},{'{','}'}};
  7. unordered_map<char,int> pri = {{'<',1},{'(',2},{'[',3},{'{',4}};
  8. void solve(){
  9. cin >> line;
  10. while(stk.size()) stk.pop();
  11. for(char c:line){
  12. if(c=='<'||c=='('||c=='['||c=='{'){
  13. if(stk.empty()) stk.push(c);
  14. else{
  15. if(pri[c]>pri[stk.top()]){
  16. cout << "NO\n";
  17. return;
  18. }else stk.push(c);
  19. }
  20. }else if(c=='>'||c==')'||c==']'||c=='}'){
  21. if(stk.empty()){
  22. cout << "NO\n";
  23. return;
  24. }else{
  25. if(mp[stk.top()]==c) stk.pop();
  26. else{
  27. cout << "NO\n";
  28. return;
  29. }
  30. }
  31. }
  32. }
  33. cout << (stk.empty()?"YES\n":"NO\n");
  34. }
  35. int main(){
  36. cin.tie(nullptr)->sync_with_stdio(false);
  37. cin >> n;
  38. while(n--) solve();
  39. return 0;
  40. }

问题 E: 数据结构-栈-计算

思路:

        利用中缀表达式可以轻松求解,注意符号之间的优先级问题,计算'-'、'/'、'^'时要注意参与运算的两个数字的先后顺序。数据范围会到2^32-1,要开long long,虽然这个题的后台测试点没有取到那么大,不过根据题意还是要这么做的。

参考题解:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4. stack<char> op;
  5. stack<ll> num;
  6. unordered_map<char,int> pri={{'+',1},{'-',1},{'*',2},{'/',2},{'^',3}};
  7. ll x;
  8. string line;
  9. bool flag;
  10. void cal(){
  11. ll num1 = num.top();num.pop();
  12. ll num2 = num.top();num.pop();
  13. char op1 = op.top();op.pop();
  14. if(op1=='+') num.push(num1+num2);
  15. else if(op1=='-') num.push(num2-num1);
  16. else if(op1=='*') num.push(num1*num2);
  17. else if(op1=='/') num.push(num2/num1);
  18. else if(op1=='^') num.push(pow(num2,num1));
  19. }
  20. int main(){
  21. cin.tie(nullptr)->sync_with_stdio(false);
  22. cin >> line;
  23. for(auto c:line){
  24. if(c>='0'&&c<='9'){
  25. x=x*10+c-'0';
  26. flag = true;
  27. }else{
  28. if(flag){
  29. num.push(x);
  30. flag = false;
  31. x = 0;
  32. }
  33. if(c=='('){
  34. op.push(c);
  35. }else if(c==')'){
  36. while(op.top()!='('){
  37. cal();
  38. }
  39. op.pop();
  40. }else{
  41. while(op.size()&&pri[op.top()]>=pri[c]){
  42. cal();
  43. }
  44. op.push(c);
  45. }
  46. }
  47. }
  48. if(flag){
  49. num.push(x);
  50. x = 0;
  51. flag = false;
  52. }
  53. while(op.size()){
  54. cal();
  55. }
  56. cout << num.top() << '\n';
  57. return 0;
  58. }

问题 F: 数据结构-栈-中缀表达式值

 

思路:

        跟上一题同理,但是这个题额外要注意的是可能存在负数,并且要判断该中缀表达式的合理性。

参考题解:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4. stack<char> op;
  5. stack<ll> num;
  6. unordered_map<char,int> pri={{'+',1},{'-',1},{'*',2},{'/',2},{'^',3}};
  7. ll x;
  8. string line;
  9. bool flag;
  10. void cal(){
  11. ll num1 = num.top();num.pop();
  12. ll num2 = num.top();num.pop();
  13. char op1 = op.top();op.pop();
  14. if(op1=='+') num.push(num1+num2);
  15. else if(op1=='-') num.push(num2-num1);
  16. else if(op1=='*') num.push(num1*num2);
  17. else if(op1=='/') num.push(num2/num1);
  18. else if(op1=='^') num.push(pow(num2,num1));
  19. }
  20. void solve(){
  21. for(auto c:line){
  22. if(c>='0'&&c<='9'){
  23. x=x*10+c-'0';
  24. flag = true;
  25. }else{
  26. if(flag){
  27. num.push(x);
  28. flag = false;
  29. x = 0;
  30. }
  31. if(c=='@') break;
  32. else if(c=='('){
  33. op.push(c);
  34. }else if(c==')'){
  35. while(op.top()!='('){
  36. cal();
  37. }
  38. op.pop();
  39. }else{
  40. while(op.size()&&pri[op.top()]>=pri[c]){
  41. cal();
  42. }
  43. op.push(c);
  44. }
  45. }
  46. }
  47. if(flag){
  48. num.push(x);
  49. x = 0;
  50. flag = false;
  51. }
  52. while(op.size()){
  53. cal();
  54. }
  55. cout << num.top() << '\n';
  56. }
  57. bool check(){
  58. if(line.size()==2) return pri[line[0]]>0?false:true;
  59. for(int i = 1;i<line.size()-1;i++){
  60. if(pri[line[i]]&&pri[line[i-1]]) return false;
  61. }
  62. ll sum = 0;
  63. for(int i = 0;i<line.size()-1;i++){
  64. if(line[i]=='(') sum++;
  65. else if(line[i]==')') sum--;
  66. }
  67. return sum==0;
  68. }
  69. int main(){
  70. cin.tie(nullptr)->sync_with_stdio(false);
  71. cin >> line;
  72. if(line[0]=='-') num.push(0);
  73. if(!check()) cout << "NO\n";
  74. else solve();
  75. return 0;
  76. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/439809
推荐阅读
相关标签
  

闽ICP备14008679号