括号匹配测试代码笔记如下:
1 #include<stdio.h> 2 #include<string.h> 3 #include <stdlib.h> 4 #define SIZE 10 5 6 typedef struct Stack 7 { 8 char c[SIZE]; //存放左弧 它是一个字符 9 int top; 10 }STACK,*PSTACK; 11 12 //1.初始化栈 13 void Init_Stack(PSTACK S) //这里只需要一个参数 把栈传进来初始化 14 { 15 S->top = 0; //栈顶是从第0个下标开始 16 for (int i = 0; i < SIZE; i++) 17 { 18 S->c[i] = 0; 19 } 20 } 21 22 //2.入栈操作 23 24 void Push_Stack(PSTACK S, char data) //参数1:表明插入的栈 参数2: 要插入的数据 25 { 26 //2.1 判断栈是否是满的 如果是满的就退出 满了你还要插入 会报错 27 28 if (S->top >= SIZE) 29 { 30 printf("栈满!无法继续插入\n"); 31 return; //结束这个函数. 32 } 33 34 //2.2 栈没有满 35 S->c[S->top] = data; 36 S->top++; //在执行插入操作之后 我的top要+1 37 } 38 39 //3.获取栈顶元素 这里只是得到栈顶元素 不是出栈 40 char GetStackTop(PSTACK S) 41 { 42 return S->c[S->top - 1]; 43 } 44 45 //4. 出栈 46 void Pop_Stack(PSTACK S) 47 { 48 //这里我就不判断 判断是不是空 49 50 S->top--; //所有操作都是同top去操作 我只需要改变top的位置 51 } 52 53 //5.判断是不是空的栈 54 int Stack_Empty(PSTACK S) //函数返回1 说明什么栈是空的 如果返回0说明栈是有元素的 55 { 56 return S->top == 0; //等于0说明栈是空的 57 } 58 //我只需要在前面代码的基础 加一个函数 59 int isEatch(PSTACK S, char *str) // 参数1: 指明左弧要入栈的是哪一个栈 参数2:要匹配的字符串 返回值:返回1说明匹配 返回0说明不匹配 60 { 61 // 得到要匹配的字符串长度 62 int len = strlen(str); 63 //循环遍历每一个字符 64 for (int i = 0; i < len; i++) // () [] {} 65 { 66 switch (str[i]) 67 { 68 case '(': 69 case '[': 70 case '{': 71 //如果是左弧 要入栈 72 73 Push_Stack(S, str[i]); 74 break; 75 case ')': 76 if (!Stack_Empty(S) && GetStackTop(S) == '(') 77 { 78 Pop_Stack(S); 79 } 80 else 81 { 82 return 0; //如果栈为空 或者 栈顶元素跟当前元素不匹配 83 } 84 break; 85 case ']': //自己写 86 break; 87 case '}': //自己写 88 break; 89 } 90 } 91 //判断最后栈里面是否还有数据 如果右说明是不匹配 92 if (!Stack_Empty(S)) 93 { 94 return 0; 95 } 96 //返回1 说明是匹配的 97 return 1; 98 99 } 100 101 int main() 102 { 103 STACK MyStack; 104 Init_Stack(&MyStack); 105 char Str[258]; 106 while (1) 107 { 108 printf("请输入一个字符串: "); 109 scanf("%s", Str); 110 int a = isEatch(&MyStack, Str); 111 if (a) 112 { 113 printf("括号匹配!\n"); 114 } 115 else 116 { 117 printf("括号不匹配!\n"); 118 } 119 } 120 return 0; 121 }