c语言/c++(数据结构篇) 之 括号匹配检验实例(栈和队列)(4/7)

实验目的及要求:

熟悉掌握利用栈完成括号是否匹配的检验。

实验内容:

利用栈完成括号匹配检验。

目的:掌握栈的后进先出原则在解决实际问题中的应用。

内容:输入一组括号,构造栈,利用栈判断所输入的括号是否匹配,并能够输出匹配、多左括号、多右括号三种不同结果。

对输入的任意个非负十进制数,打印出与其值相等的八进制数。

具体实现过程:

1、以数组表达顺序栈,用来存放将要输入的括号;

2、通过栈底指针的不同取值区分不同情况;

3、对函数进行连接。

4、基本要求:检验有圆括号出现的情况;深入分析:检验同时出现圆括号、方括号和花括号的情况。

实验步骤与程序:

#include<stdio.h>

#include<stdlib.h>

typedef struct

{

      int *base;

      int *top;

      int size;

}sqstack;

sqstack initstack()

{

      sqstack s;

      s.base=(int *)malloc(100*sizeof(int));

      s.top=s.base;

      return s;

}

sqstack push(sqstack s,int e)

{

      *(s.top)=e;

      s.top++;

      return s;

}

int gettop(sqstack s)

{

      if(s.base==s.top)

      {

            return 0;

      }

      return *(s.top-1);

}

sqstack pop(sqstack s)

{

      s.top--;

      return s;

}

void print(sqstack s)

{

      while(gettop(s)!=0)

      {

            printf("%d\n",gettop(s));

            s=pop(s);

      }

}

int main()

{

      sqstack s;

      char c=' ';

      s=initstack();

      printf("请输入括号,以#结束\n");

      while(c!='#')

      {

            scanf("%c",&c);

            switch (c)

            {

                  case '(':s=push(s,1);break;

                  case '[':s=push(s,2);break;

                  case '{':s=push(s,3);break;

                  case ')':

                       {

                             if(gettop(s)==0)

                             {

                                   printf("多了*)*\n");

                                   return 0;

                             }

                             else if(gettop(s)==1)

                             {

                                   s=pop(s);

                             }

                             else

                             {

                                   printf("括号不匹配!\n");

                                   return 0;

                             }

                            

                       };break;

                  case ']':

                       {

                             if(gettop(s)==0)

                             {

                                   printf("多了*]*\n");

                                   return 0;

                             }

                             else if(gettop(s)==2)

                             {

                                   s=pop(s);

                             }

                             else

                             {

                                   printf("括号不匹配!\n");

                                   return 0;

                             }

                            

                       };break;

                  case '}':

                       {

                             if(gettop(s)==0)

                             {

                                   printf("多了*}*\n");

                                   return 0;

                             }

                             else if(gettop(s)==3)

                             {

                                   s=pop(s);

                             }

                             else

                             {

                                   printf("括号不匹配!\n");

                                   return 0;

                             }

                            

                       };break;

                  default:break;

            }

      }

      if(s.top==s.base)

      {

            printf("括号匹配\n");

      }

      else

      {

            printf("多了左括号\n");

      }

      return 0;

 }

运行结果:

结果分析与讨论:

1. 我们可以利利用栈的特点即后进先出的特点来实现括号匹配的检验,存储括号字符的数组通过malloc实现动态分配长度,每读入一个括号,若是左括号,则直接进栈,等待相匹配的同类右括号;若读入的是右括号,且与当前栈顶左括号同类型,则二者匹配,将栈顶的左括号弹出,否则属于不合法情况。另外。如果输入序列已经读完,而栈中仍有等待匹配的左括号,或者读入一个右括号,而栈中已无等待匹配的同类型左括号,均属于不匹配的情况。

猜你喜欢

转载自blog.csdn.net/qq_59819866/article/details/131451069