C++学习(三十一)(C语言部分)之 栈和队列(括号匹配示例)
程序员文章站
2024-02-01 18:05:40
括号匹配测试代码笔记如下: ......
括号匹配测试代码笔记如下:
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 }