2020考研-王道数据结构-栈和队列-栈和队列的应用

ゝ一世哀愁。 2022-01-29 09:15 332阅读 0赞

第一题

题目简述

括号匹配问题。给定一个只包含{、【、(、)、】、}的括号序列,判断这个序列是否合法。

题目思路

这四个题目,第一题和第三题比较重要,对于二和四是纯模拟题目。括号匹配问题是典型的栈的应用。思路是当遇到左括号时入栈,遇到右括号时,出栈,出栈的时候需要判断栈顶的左括号和我当前的右括号是否匹配,如果匹配则继续判断下一个,不匹配的话直接得出结论,括号序列不匹配,直至括号序列判断到结尾。

代码
  1. #include <iostream>
  2. #include <stack>
  3. using namespace std;
  4. const int N = 200; // 字符串的最大长度
  5. char str[N];
  6. bool judge()
  7. {
  8. stack<char> stk;
  9. for (int i = 0; str[i]; i++)
  10. {
  11. switch (str[i])
  12. {
  13. case '(':stk.push('('); break;
  14. case '[':stk.push('['); break;
  15. case '{':stk.push('{'); break;
  16. case ')':{
  17. if (!stk.size() || stk.top() != '(') return false;
  18. stk.pop();
  19. break;
  20. }
  21. case ']':{
  22. if (!stk.size() || stk.top() != '[') return false;
  23. stk.pop();
  24. break;
  25. }
  26. case '}':{
  27. if (!stk.size() || stk.top() != '{') return false;
  28. stk.pop();
  29. break;
  30. }
  31. default:
  32. break;
  33. }
  34. }
  35. return true;
  36. }
  37. int main()
  38. {
  39. while (true)
  40. {
  41. cin >> str;
  42. if (judge()){
  43. cout << "匹配" << endl;
  44. }
  45. else
  46. {
  47. cout << "不匹配" << endl;
  48. }
  49. }
  50. }

第二题

题目简述

火车道路上有n节车厢,这n节车厢中分为硬卧车厢用H表示,软卧车辆用S表示,现在给你一个只包含H、S的序列,通过栈操作,使所有的硬卧车厢排列在软卧车厢之后。

代码
  1. #include <iostream>
  2. #include <stack>
  3. using namespace std;
  4. const int N = 200; // 字符串的最大长度
  5. char str[N];
  6. // 利用栈调整列车,遇见硬卧车辆入栈,最后再把硬卧车辆加进火车列
  7. void calc()
  8. {
  9. stack<int> stk;
  10. for (int i = 0; str[i]; i++)
  11. {
  12. if (str[i] == 'H') stk.push(i);
  13. else cout << i << " ";
  14. }
  15. while (stk.size()){
  16. cout << stk.top() << " ";
  17. stk.pop();
  18. }
  19. cout << endl;
  20. }
  21. int main()
  22. {
  23. while (cin >> str)
  24. {
  25. calc();
  26. }
  27. return 0;
  28. }

第三题

题目简述

利用栈实现递归计算
P n ( x ) = { 1 , n = 0 2 x , n = 1 2 x P n − 1 ( x ) − 2 ( n − 1 ) P n − 2 ( x ) , n > 1 P_n(x)= \begin{cases} 1, & \text {n = 0} \\ 2x, & \text{n = 1}\\2xP_{n-1}(x) - 2(n-1)P_{n-2}(x) ,&\text{n > 1} \end{cases} Pn(x)=⎩⎪⎨⎪⎧1,2x,2xPn−1(x)−2(n−1)Pn−2(x),n = 0n = 1n > 1

题目思路

感觉有点为了用栈而用栈的意思了,其实大家的思路就是,从第三项一直递推到第n项,我当时也是这么写的代码,我不知道这和栈有啥关系,感觉完全没必要用上栈,答案中的代码也是,感觉没必要用上栈。

代码
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <stack>
  4. using namespace std;
  5. struct Node
  6. {
  7. int val;
  8. int n;
  9. Node(int tval, int tn) :
  10. val(tval), n(tn)
  11. {
  12. };
  13. };
  14. // 利用栈模拟递归,假设p1 到pn全部已经计算出来
  15. int P(int n,int x)
  16. {
  17. if (n == 0) return 1;
  18. if (n == 1) return x << 1;
  19. stack<Node> stk;
  20. int f0 = 1, f1 = x << 1;
  21. for (int i = n; i >= 2; i--){
  22. stk.push(Node(0, i));
  23. }
  24. while (stk.size())
  25. {
  26. Node node = stk.top();
  27. stk.pop();
  28. node.val = (x << 1) * f1 - ((node.n - 1) << 1) * f0;
  29. f0 = f1;
  30. f1 = node.val;
  31. }
  32. return f1;
  33. }
  34. int main()
  35. {
  36. int n, x;
  37. while (cin >> n >> x)
  38. {
  39. cout << "P(" << n << "," << x << ")=" << P(n, x) << endl;
  40. }
  41. return 0;
  42. }

第四题

纯模拟问题代码可以写,但没必要,/哈哈哈

题目简述

模拟一个区汽车轮渡口的调度系统,规定调度口只有两类车【客车】和【货车】。规定,一艘船的容量为10辆车,并且客车先于货车上船,并且每上4辆客车就上一辆货车,若客车不足4辆,就把剩余货车上船。

发表评论

表情:
评论列表 (有 0 条评论,332人围观)

还没有评论,来说两句吧...

相关阅读

    相关 实际应用

    1.将一个非负的十进制整数N转换成其他D进制数。 解决思路,连续取模%和整除/。D进制各数位的产生顺序是从低位到高位,而输出顺序却是从高位到低位,刚好相反,可以考虑使用栈进行