71.png

    1. // createStack.cpp
    2. #include<stdio.h>
    3. #include<stdbool.h>
    4. #include<stdlib.h>
    5. #define TYPE int
    6. //#define TYPE biTree*
    7. //#define TYPE char
    8. //#define TYPE Recursion
    9. struct biTree {
    10. char data;
    11. struct biTree *lchild;
    12. struct biTree *rchild;
    13. };
    14. struct Recursion {
    15. int no;
    16. int val;
    17. };
    18. struct Stack
    19. {
    20. TYPE* arr; //内存首地址
    21. int len; //栈的容量
    22. int top; //栈的下标
    23. };
    24. /* --------------以下为实现函数--------------------*/
    25. //创建一个栈
    26. Stack *createStack(int size) {
    27. struct Stack *stack = (struct Stack*)malloc(sizeof(struct Stack));//给栈分配空间
    28. stack->arr = (TYPE *)malloc(sizeof(TYPE)*size);//给内存首地址分配空间,大小用户指定
    29. stack->len = size;//栈容量
    30. stack->top = -1;//栈顶下标,当前无元素,故为-1
    31. return stack;
    32. }
    33. //判断栈满
    34. bool full(Stack *stack) {
    35. return stack->top + 1 >= stack->len;
    36. }
    37. //判断栈空
    38. bool empty(Stack *stack) {
    39. return stack->top == -1;
    40. }
    41. //入栈
    42. bool push(Stack *stack, TYPE p) {
    43. if (full(stack)) return false;
    44. *(stack->arr + ++stack->top) = p;
    45. return true;
    46. }
    47. //出栈
    48. bool pop(Stack *stack) {
    49. if (empty(stack)) return false;
    50. stack->top--;
    51. return true;
    52. }
    53. //查看栈顶元素
    54. TYPE top(Stack *stack) {
    55. if (empty(stack)) return NULL;
    56. return *(stack->arr + stack->top);
    57. }
    58. //销毁
    59. void destory(Stack *stack) {
    60. free(stack->arr);
    61. free(stack);
    62. }
    63. //判断是否含有某个元素
    64. bool contain(Stack *stack, TYPE r) {
    65. if (empty(stack)) return false;
    66. for (int i = stack->top; i >= 0; i--) {
    67. if (r == *(stack->arr + i) ){//疯了,我居然把==写成了=
    68. return true;
    69. }
    70. }
    71. return false;
    72. }
    1. /*
    2. 假设一个算法表达式包含圆括号、方括号、和花括号3种类型的括号,编写一个算法来判断表达式里的括号是否配对,以字符‘\0’作为
    3. 算术表达式的结束符。
    4. 分析:
    5. 我们利用队列来存储算术表达式,再利用一个栈来进行判定,具体流程为:依次从队列中取出表达式,如果是左括号则入栈,
    6. 如果是右括号则取出栈顶元素,比对是否配对,如果不匹配,终止,匹配则继续。
    7. */
    8. struct LinkQueue {
    9. struct Link *front, *rear;
    10. };
    11. struct Stack
    12. {
    13. char* arr; //内存首地址
    14. int len; //栈的容量
    15. int top; //栈的下标
    16. };
    17. #define _CRT_SECURE_NO_WARNINGS
    18. #include <stdio.h>
    19. bool matchBracket(LinkQueue *lq, Stack *s) {
    20. char letterQ, letterS;
    21. bool isEmpty(LinkQueue *);
    22. bool deQueue(LinkQueue *, char *);
    23. bool push(Stack *, char);
    24. char top(Stack *);
    25. bool pop(Stack *);
    26. bool empty(Stack *);
    27. while (!isEmpty(lq)) {//如果队列不空
    28. deQueue(lq, &letterQ);//取出队首元素
    29. if (letterQ == '(' || letterQ == '{' || letterQ == '[') {//如果是左括号,入栈
    30. push(s, letterQ);
    31. }
    32. else {//如果是右括号,取出栈顶元素对比
    33. if (empty(s)) {
    34. return false;
    35. }
    36. letterS = top(s);
    37. pop(s);
    38. switch (letterQ) {
    39. case ')': if (letterS != '(')return false; break;
    40. case ']': if (letterS != '[' ) return false; break;
    41. case '}': if (letterS != '{' ) return false; break;
    42. default:break;
    43. }
    44. }
    45. }
    46. if (empty(s)) {
    47. return true;
    48. }
    49. else {
    50. return false;
    51. }
    52. }
    53. int main() {
    54. int n;//栈的大小
    55. char letter;
    56. struct LinkQueue *lq;
    57. struct Stack *s;
    58. LinkQueue *create();
    59. bool enQueue(LinkQueue *, char);
    60. void printQ(LinkQueue *);
    61. Stack *createStack(int);
    62. lq = create();
    63. printf("请输入栈的大小:n=");
    64. scanf("%d", &n);
    65. for (int i = 0; i < n; i++) {
    66. scanf("\n%c", &letter);
    67. enQueue(lq, letter);
    68. }
    69. printQ(lq);
    70. printf("\n");
    71. s = createStack(n);
    72. if (matchBracket(lq, s)) {
    73. printf("该算术表达式配对");
    74. }
    75. else {
    76. printf("该算术表达式不配对");
    77. }
    78. return 0;
    79. }