当前位置:   article > 正文

栈及栈的应用-括号匹配_csdn根据栈的数据结构,建立一个栈,利用栈实现如下其中一个应用: 判断表达式括号是

csdn根据栈的数据结构,建立一个栈,利用栈实现如下其中一个应用: 判断表达式括号是

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

1.创建一个栈

top为栈顶

  1. typedef struct CharStack {
  2. int top;
  3. int data[STACK_MAX_SIZE];
  4. } *CharStackPtr;

2.进栈

每次进栈是将新元素放在栈顶的上方,新元素又成为新的栈顶,后续元素就重复这个操作

  1. void push(CharStackPtr paraStackPtr, int paraValue) {
  2. if (paraStackPtr->top >= STACK_MAX_SIZE - 1) {
  3. printf("Cannot push element: stack full.\r\n");
  4. return;
  5. }
  6. paraStackPtr->top ++;
  7. paraStackPtr->data[paraStackPtr->top] = paraValue;
  8. }

3.出栈

出栈的时候只能从栈顶先拿出,栈顶相领元素又成为新的栈顶,将所需元素拿出后再将上面的放回去

  1. char pop(CharStackPtr paraStackPtr) {
  2. if (paraStackPtr->top < 0) {
  3. printf("Cannot pop element: stack empty.\r\n");
  4. return '\0';
  5. }
  6. paraStackPtr->top --;
  7. return paraStackPtr->data[paraStackPtr->top + 1];
  8. }

4.打印栈

  1. void outputStack(CharStackPtr paraStack) {
  2. for (int i = 0; i <= paraStack->top; i ++) {
  3. printf("%c ", paraStack->data[i]);
  4. }
  5. printf("\r\n");
  6. }

5.测试函数

  1. void pushPopTest() {
  2. printf("---- pushPopTest begins. ----\r\n");
  3. CharStackPtr tempStack = charStackInit();
  4. printf("After initialization, the stack is: ");
  5. outputStack(tempStack);
  6. for (char ch = 'a'; ch < 'm'; ch ++) {
  7. printf("Pushing %c.\r\n", ch);
  8. push(tempStack, ch);
  9. outputStack(tempStack);
  10. }
  11. for (int i = 0; i < 3; i ++) {
  12. char ch = pop(tempStack);
  13. printf("Pop %c.\r\n", ch);
  14. outputStack(tempStack);
  15. }
  16. printf("---- pushPopTest ends. ----\r\n");
  17. }

测试结果

栈的应用-括号匹配

首先将第一个位置赋为#,方便后续判断,如果为左括号就放进栈里,如果为右括号的话,就将栈顶的元素拿出和这个括号对比,如果的匹配的话就继续循环,如果不匹配的话就返回false,循环完后判断栈顶是否为#,如果是就返回ture,不是就返回false

  1. bool bracketMatching(char* paraString, int paraLength) {
  2. CharStackPtr tempStack = charStackInit();
  3. push(tempStack, '#');
  4. char tempChar, tempPopedChar;
  5. for (int i = 0; i < paraLength; i++) {
  6. tempChar = paraString[i];
  7. switch (tempChar) {
  8. case '(':
  9. case '[':
  10. case '{':
  11. push(tempStack, tempChar);
  12. break;
  13. case ')':
  14. tempPopedChar = pop(tempStack);
  15. if (tempPopedChar != '(') {
  16. return false;
  17. }
  18. break;
  19. case ']':
  20. tempPopedChar = pop(tempStack);
  21. if (tempPopedChar != '[') {
  22. return false;
  23. }
  24. break;
  25. case '}':
  26. tempPopedChar = pop(tempStack);
  27. if (tempPopedChar != '{') {
  28. return false;
  29. }
  30. break;
  31. default:
  32. break;
  33. }
  34. }
  35. tempPopedChar = pop(tempStack);
  36. if (tempPopedChar != '#') {
  37. return false;
  38. }
  39. return true;
  40. }

运行结果

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号