当前位置:   article > 正文

栈及其运用_栈及其应用

栈及其应用

感悟

栈是一种只能从表的一端存取数据且遵循 "先进后出" 原则的线性存储结构。栈是一种只能从表的一端存取数据且遵循 "先进后出" 原则的线性存储结构。

我发现了,基于在之前的学到的许许多多的结构,我发现了其实数据结构学来的目的其实应该与因地制宜的道理相同,根据对于数据的不同操作,我就要选取不同的数据结构来定义使用。就好比如果我要实现括号匹配,那么就应该用栈这样的“先出后进”的数据结构形态,这样才可以完美的适配。再比如,若要对数据进行排序,使用链表只会增加计算机处理代码的复杂度,不利于其良好的运转,与此同时算法复杂,不利于我们去理解和思考。而线性表便完美的解决了这一问题,这也就是为什么如此多数据结构出现的必然,使用数据结构的多样性,对我们以后对数据的处理以及操作有了很大的提升。如果条件允许的情况下,我也愿意去继续进行计算机数据结构的开发,寻找更多的适用的结构,推动计算机代码的发展。

对于多项式的加法,我的代码目前还在研究当中,只能先抄写一下学长的去学习一下,我本人其实对于C++这一语言不太懂,对于我理解来说还是有一些困难的,所以希望大家可以教教我,为我讲解一下其与C语言不同的地方,帮助我理解,感谢在我的帖子底下留言

在学习老师代码的过程中,我不仅仅学到了栈这一数据结构的知识,同时我学到了许许多多的语言规范,在我上学期打代码的时候,我只会使用abcd来定义变量,这样的代码我自己也感觉到其不妥,每次当我出错的时候,我就要从我众多abcd中去寻找到底是哪里出错了,这样给我造成了巨大的麻烦,而到这学期,我要是还像以前你要去定义变量,若最终出错,我会崩溃的。而老师这样的规范就正好帮助了解决了这个难题,成功的实现代码上的突破。

代码

(1)括号匹配

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #define STACK_MAX_SIZE 10
  4. typedef struct CharStack
  5. {
  6. int top;
  7. int data[STACK_MAX_SIZE];
  8. } *CharStackPtr;
  9. void outputStack(CharStackPtr paraStack)
  10. {
  11. for (int i = 0; i <= paraStack->top; i ++)
  12. {
  13. printf("%c ", paraStack->data[i]);
  14. }
  15. printf("\r\n");
  16. }
  17. CharStackPtr charStackInit()
  18. {
  19. CharStackPtr resultPtr = (CharStackPtr)malloc(sizeof(struct CharStack));
  20. resultPtr->top = -1;
  21. return resultPtr;
  22. }
  23. void push(CharStackPtr paraStackPtr, int paraValue)
  24. {
  25. if (paraStackPtr->top >= STACK_MAX_SIZE - 1)
  26. {
  27. printf("Cannot push element: stack full.\r\n");
  28. return;
  29. }
  30. paraStackPtr->top ++;
  31. paraStackPtr->data[paraStackPtr->top] = paraValue;
  32. }
  33. char pop(CharStackPtr paraStackPtr)
  34. {
  35. if (paraStackPtr->top < 0) {
  36. printf("Cannot pop element: stack empty.\r\n");
  37. return '\0';
  38. }
  39. paraStackPtr->top --;
  40. return paraStackPtr->data[paraStackPtr->top + 1];
  41. }
  42. void pushPopTest()
  43. {
  44. printf("---- pushPopTest begins. ----\r\n");
  45. CharStackPtr tempStack = charStackInit();
  46. printf("After initialization, the stack is: ");
  47. outputStack(tempStack);
  48. for (char ch = 'a'; ch < 'm'; ch ++)
  49. {
  50. printf("Pushing %c.\r\n", ch);
  51. push(tempStack, ch);
  52. outputStack(tempStack);
  53. }
  54. for (int i = 0; i < 3; i ++) {
  55. char cha = pop(tempStack);
  56. printf("Pop %c.\r\n", cha);
  57. outputStack(tempStack);
  58. }
  59. printf("---- pushPopTest ends. ----\r\n");
  60. }
  61. bool bracketMatching(char* paraString, int paraLength) {
  62. CharStackPtr tempStack = charStackInit();
  63. push(tempStack, '#');
  64. char tempChar, tempPopedChar;
  65. for (int i = 0; i < paraLength; i++) {
  66. tempChar = paraString[i];
  67. switch (tempChar) {
  68. case '(':
  69. case '[':
  70. case '{':
  71. push(tempStack, tempChar);
  72. break;
  73. case ')':
  74. tempPopedChar = pop(tempStack);
  75. if (tempPopedChar != '(') {
  76. return false;
  77. }
  78. break;
  79. case ']':
  80. tempPopedChar = pop(tempStack);
  81. if (tempPopedChar != '[') {
  82. return false;
  83. }
  84. break;
  85. case '}':
  86. tempPopedChar = pop(tempStack);
  87. if (tempPopedChar != '{') {
  88. return false;
  89. }
  90. break;
  91. default:
  92. break;
  93. }
  94. }
  95. tempPopedChar = pop(tempStack);
  96. if (tempPopedChar != '#') {
  97. return true;
  98. }
  99. return true;
  100. }
  101. void bracketMatchingTest()
  102. {
  103. printf("\r\n---- bracketMatchingTest ----\r\n");
  104. char* tempExpression = "[2 + (1 - 3)] * 4";
  105. bool tempMatch = bracketMatching(tempExpression, 17);
  106. printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch);
  107. tempExpression = "( ) )";
  108. tempMatch = bracketMatching(tempExpression, 6);
  109. printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch);
  110. tempExpression = "()()(())";
  111. tempMatch = bracketMatching(tempExpression, 8);
  112. printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch);
  113. tempExpression = "({}[])";
  114. tempMatch = bracketMatching(tempExpression, 6);
  115. printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch);
  116. tempExpression = ")(";
  117. tempMatch = bracketMatching(tempExpression, 2);
  118. printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch);
  119. printf("---- bracketMatchingTest ----");
  120. }
  121. int main()
  122. {
  123. pushPopTest();
  124. bracketMatchingTest();
  125. return 0;
  126. }

测试结果

(2)多项式的加法

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <stack>
  5. #include <unordered_map>
  6. using namespace std;
  7. stack<int> num;
  8. stack<char> op;
  9. void eval()
  10. {
  11. auto b = num.top();
  12. num.pop();
  13. auto a = num.top();
  14. num.pop();
  15. auto c = op.top();
  16. op.pop();
  17. int x;
  18. if (c == '+') x = a + b;
  19. else if (c == '-') x = a - b;
  20. else if (c == '*') x = a * b;
  21. else x = a / b;
  22. num.push(x);
  23. }
  24. int main()
  25. {
  26. unordered_map<char, int> pr{{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}};
  27. string str;
  28. cin >> str;
  29. for (int i = 0; i < str.size(); i ++ )
  30. {
  31. auto c = str[i];
  32. if (isdigit(c))
  33. {
  34. int x = 0, j = i;
  35. while (j < str.size() && isdigit(str[j]))
  36. x = x * 10 + str[j ++ ] - '0';
  37. i = j - 1;
  38. num.push(x);
  39. }
  40. else if (c == '(') op.push(c);
  41. else if (c == ')')
  42. {
  43. while (op.top() != '(') eval();
  44. op.pop();
  45. }
  46. else
  47. {
  48. while (op.size() && op.top() != '(' && pr[op.top()] >= pr[c]) eval();
  49. op.push(c);
  50. }
  51. }
  52. while (op.size()) eval();
  53. cout << num.top() << endl;
  54. return 0;
  55. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/869035
推荐阅读
相关标签
  

闽ICP备14008679号