用栈实现括号匹配的检验
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用栈实现括号匹配的检验相关的知识,希望对你有一定的参考价值。
试验要求:
1、 设计栈,存储括号。
2、 利用进栈、出栈操作实现括号匹配算法。
3、 不另外申请存储空间,算法有较好的性能。
4、 设计驱动程序、测试用例,并得出正确结果。
提示:
在表达式中,相同类型的括号(包括:()、[ ]、)是成对出现的,并且当括号在表达式中嵌套时,不允许出现交叉现象。检验括号匹配的方法,就是对给定的字符串依次检验:若是左括号,入栈;若是右括号,出栈一个左括号判断是否与之匹配;是其他字符,不检验。检验到字符串尾,还要检查栈是否为空。只有栈空,整个字符串才是括号匹配的。
#include <string.h>
#define MAX_STACK 100
struct stStack
char szStack[MAX_STACK];
int nTop;
;
void InitStack(stStack& s)
s.nTop = -1;
char Push(stStack& s, char c)
if (s.nTop == MAX_STACK - 1)
return 0;
s.nTop ++;
s.szStack[s.nTop] = c;
return c;
char Pop(stStack& s)
if (s.nTop == -1)
return 0;
char c = s.szStack[s.nTop];
s.nTop--;
return c;
int Check(char* szText)
stStack s;
InitStack(s);
int nLen = strlen(szText);
for (int i = 0; i < nLen; i++)
char c = szText[i];
switch (c)
case '(':
case '':
case '[':
Push(s, c);
break;
case ')':
if (Pop(s) != '(')
return 0;
break;
case '':
if (Pop(s) != '')
return 0;
break;
case ']':
if (Pop(s) != '[')
return 0;
break;
return 1;
int main()
char szText[100];
scanf("%s", szText);
if (Check(szText))
printf("合法\n");
else
printf("失败\n");
return 0;
参考技术A #include
#include
#define MaxSize 100
typedef char ElemType;//定义数据类型
//定义顺序栈
typedef struct
ElemType data[MaxSize];//数据域
int top;//栈顶指针
SeqStack;
//栈初始化
int InitStack(SeqStack *s)
s->top=-1;//初始化栈顶,指向空
return 1;
//入栈
int Push(SeqStack *s,ElemType x)
if (s->top == MaxSize -1 )
printf("栈已满,不能入栈.\n");
return 0;
else
s->top++;//栈顶指针上移
s->data[s->top] = x;//数据元素入栈
return 1;
//出栈
int Pop(SeqStack *s,ElemType *x)
if (s->top == -1)
printf("栈为空,不能出栈.\n");
return 0;
else
*x=s->data[s->top];//取出栈顶元素值
s->top--;//栈顶指针下移
return 1;
//取栈顶值
int GetTop(SeqStack *s,ElemType *x)
if (s->top == -1)
printf("栈为空,不能取值.\n");
return 0;
else
*x=s->data[s->top];//取出栈顶元素值
return 1;
//判断栈是否为空
int IsEmpty(SeqStack *s)
if(s->top==-1)
return 1;
return 0;
int Check(char str[],int len)
int i;
int flag=1;//合法标志0-不合法 1-合法
int exist=0;//小括号存在标志 0-不在 1-在
ElemType x;
SeqStack s;//栈s
//栈初始化
InitStack(&s);
for(i=0;i<len;i++)
if(str[i]=='')//大括号
if(IsEmpty(&s))//栈空,直接入栈
if(Push(&s,str[i])!=1)
flag=0;
break;
else//栈非空,判断合法性
if(GetTop(&s,&x)!=1)//取栈顶值
flag=0;
break;
if(x=='' || x=='[' || x== '(')//如果是,[或者(,非法
flag=0;
break;
else//否则入栈
if(Push(&s,str[i])!=1)
flag=0;
break;
else if(str[i]=='[')//方括号[
if(IsEmpty(&s))//栈空,直接入栈
if(Push(&s,str[i])!=1)
flag=0;
break;
else//栈非空,判断合法性
if(GetTop(&s,&x)!=1)//取栈顶值
flag=0;
break;
if(x=='[' || x== '(')//如果是[或者(,非法
flag=0;
break;
else//否则入栈
if(Push(&s,str[i])!=1)
flag=0;
break;
else if(str[i]=='(')//小括号(
//直接入栈
if(Push(&s,str[i])!=1)
flag=0;
break;
exist=1;//小括号存在
else if(str[i]==')')//小括号)
if(Pop(&s,&x)!=1)
flag=0;
break;
if(x!='(')//如果出栈非(,非法
flag=0;
break;
else if(str[i]==']')//方括号]
if(Pop(&s,&x)!=1)
flag=0;
break;
if(x!='[')//如果出栈非[,非法
flag=0;
break;
if(exist==0)//小括号不存在,单独[],非法
flag=0;
break;
else if(str[i]=='')//大括号
if(Pop(&s,&x)!=1)
flag=0;
break;
if(x!='')//如果出栈非,非法
flag=0;
break;
if(exist==0)//小括号不存在,单独[],非法
flag=0;
break;
else//其它字符跳过
continue;
if(!IsEmpty(&s))//循环完毕,栈非空,非法
flag=0;
return flag;
//主函数
int main(void)
char str[MaxSize];//录入字符串
int i,len;
while(1)
printf("输入字符串\n");
gets(str);
len=strlen(str);
if(len>=MaxSize)//超过定义长度
return 1;
if(Check(str,len)==1)
printf("匹配合法!\n");
else
printf("不合法\n");
printf("是否继续? 1-是,0否 :");
if(scanf("%d",&i)!=1 || i!=1)
break;
fflush(stdin);
return 0;
括号匹配的检验
头文件中
#include<stdio.h> #include<stdlib.h> typedef char Elem; typedef int status; #define MAXSIZE 100 #define ERROR 0 #define OK 1 typedef struct{ Elem data[MAXSIZE]; int top; }SqStack; //初始化 void Initstack(SqStack &S) { if(!S.data) exit(-1); S.top = 0; } //入栈 status Push(SqStack &S,Elem e) { if(S.top==MAXSIZE) { printf("栈满了 "); return ERROR; } S.data[S.top++] = e; return OK; } //出栈 status Pop(SqStack &S) { if(S.top==0) return ERROR; S.top--; } //获得栈顶元素 status getTop(SqStack S,Elem &e) { if(S.top==0) return ERROR; e = S.data[S.top-1]; return OK; }
//括号匹配 status Match(SqStack &S) { printf("---------------输入想要匹配的括号----------------- "); printf(" 括号范围[]、{}、() "); char str[MAXSIZE]; gets(str); printf(" "); Elem pre = ‘#‘;//假如第一个括号是右括号,则与其匹配,当然肯定匹配错误 int i=0; while(str[i]!=‘