欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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 }