如何使用栈来实现括号匹配

Posted me-moirs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用栈来实现括号匹配相关的知识,希望对你有一定的参考价值。

题目:

给定一串字符,不超过100个字符,可能包括括号、数字、字母、标点符号、空格,编程检查这一串字符中的( ) ,[ ],{ }是否匹配。

输入格式:

输入在一行中给出一行字符串,不超过100个字符,可能包括括号、数字、字母、标点符号、空格。

输出格式:

如果括号配对,输出yes,否则输出no。

  1. 代码实现:
  1 #include<iostream>
  2 #include<cstdlib>
  3 using namespace std;
  4 #define OVERFLOW 1        
  5 #define ERROR 0
  6 #define OK -2
  7 #define MAXSIZE 100
  8 typedef int SElemType;
  9 typedef int Status; 
 10 typedef struct//顺序栈的定义 
 11 {
 12  SElemType *base;//栈底指针
 13  SElemType *top;//栈顶指针
 14  int stacksize;//栈可用的最大容量 
 15 }SqStack;
 16 Status InitStack(SqStack &S)//顺序栈的初始化 
 17 {
 18  S.base=new SElemType[MAXSIZE];
 19  if(!S.base) exit(OVERFLOW);//存储分配失败 
 20  S.top=S.base;//空栈 ,top 初始化 base 
 21  S.stacksize=MAXSIZE;//stacksize 置为栈的最大容量MAXSIZE 
 22  return OK;
 23 }
 24 bool StackEmpty(SqStack S)//判断是否栈空 
 25 {
 26  if(S.top==S.base) return true;
 27  else return false;
 28 }
 29 Status Push(SqStack &S,SElemType x)//入栈 
 30 {
 31  if(S.top-S.base==S.stacksize) return ERROR;//栈满 
 32  *S.top++=x;//元素e压入栈顶,栈顶指针加1  后置自加 *S.top=e;S.top++;
 33  return OK;
 34 } 
 35 Status POP(SqStack &S,SElemType &x)//出栈 
 36 {
 37  if(S.top==S.base) return ERROR;//栈空 
 38  x=*--S.top;//栈顶指针减1,将栈顶元素赋给e  前置 --S.top;e=*S.top;
 39  return OK; 
 40 }
 41 SElemType GetTop(SqStack S)//取栈顶元素 
 42 {
 43  if(S.top!=S.base)  return *(S.top-1);
 44 }
 45 int main()
 46 {
 47  int flag = 1;//需要一个标记
 48  SqStack S; 
 49  InitStack(S);
 50  SElemType x;
 51 
 52  char ch[100];//采用字符数组
 53  cin.getline(ch,100);
 54  int length=0;
 55  for(int i=0;ch[i]!=;i++)
 56  {
 57   length++;
 58  }
 59 
 60  for(int i=0;i<length;i++)//遍历每一个字符
 61  {
 62   switch(ch[i])
 63   {
 64    case {:
 65 //    Push(S,ch[i]);
 66 //    break; 
 67    case (:
 68 //    Push(S,ch[i]);
 69 //    break; 
 70    case [:
 71     Push(S,ch[i]);
 72     break; //退出switch语句,不会退出外面的循环结构
 73    case ):
 74     if(!StackEmpty(S) && GetTop(S)==()
 75      POP(S,x);
 76     else{flag = 0;
 77      cout<<"no";
 78      return 0;
 79     }
 80     break;
 81    case ]:
 82     if(!StackEmpty(S) && GetTop(S)==[)
 83      POP(S,x);
 84 //    else 
 85 //     flag = 0;
 86     else{flag = 0;
 87      cout<<"no";
 88      return 0;
 89     } 
 90     break; 
 91    case }:
 92     if(!StackEmpty(S) && GetTop(S)=={)
 93      POP(S,x);
 94     else{flag = 0;
 95      cout<<"no";
 96      return 0;
 97     } 
 98     break;
 99   }
100  }
101  if(flag && StackEmpty(S)) cout<<"yes";
102  else cout<<"no"; 
103  return 0;
104 }

2.分析总结:多思考,多尝试,多回顾总结

 

以上是关于如何使用栈来实现括号匹配的主要内容,如果未能解决你的问题,请参考以下文章

括号匹配算法

栈的应用——逆序输出和括号匹配

Java 栈 如何实现括号匹配

B - Parentheses Balance (UVA - 673)

最长有效括号

leetcode每日一题--有效括号的字符串匹配(双栈模拟)