((())),最后的左括号要优先匹配——栈
#include <stdio.h> #define MaxSize 10 typedef struct { char data[MaxSize]; int top; }SeqStack; //初始化栈 void InitStack(SeqStack &S) { for(int i=0;i<MaxSize;i++) { S.data[i]=NULL; } S.top=-1; //指栈顶元素,初始时置为-1; } //判断栈是否为空 bool StackEmpty(SeqStack S) { return S.top==-1; } //入栈 bool Push(SeqStack &S,char x) { if(S.top==MaxSize-1) return false; S.top++; S.data[S.top]=x; return true; } //出栈 bool Pop(SeqStack &S,char &x) { if(S.top==-1) return false; x=S.data[S.top]; S.top--; return true; } //核心代码,这里为了结果直观,对不同匹配情况进行了打印,考试时可以不用,在调用Push、Pop等时对其简单 //注 释,可直接调用 bool BraketCheck(char Str[],SeqStack S) { //判断是否有括号1 for(int i=0;i<6;i++) { //判断是否有左括号 if(Str[i]=='['||Str[i]=='(') { //左括号入栈 Push(S,Str[i]); } else { //判断是否栈空 if(!StackEmpty(S)) { char b; Pop(S,b); //弹出栈顶元素b //判断括号是否匹配, if(Str[i]==')'&&b=='(') { printf("%c %c\n",b,Str[i]);} else if(Str[i]==']'&&b=='['){ printf("%c %c\n",b,Str[i]);} else { printf("Failed!Different type of baracet!\n");return false; } } else { printf("Failed!Right Sigle.\n"); return false; } } } if(StackEmpty(S)){printf("Sucess!\n"); return true;} else{printf("Failed!Left Sigle!\n");return true;} } //栈的应用——括号的匹配 int main(void) { SeqStack S; InitStack(S); char Str[6]={'[','(',')',']',')',')'}; BraketCheck(Str,S); return 0; }