用栈实现括号匹配的检验

Posted

tags:

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

试验要求:
1、 设计栈,存储括号。
2、 利用进栈、出栈操作实现括号匹配算法。
3、 不另外申请存储空间,算法有较好的性能。
4、 设计驱动程序、测试用例,并得出正确结果。
提示:
在表达式中,相同类型的括号(包括:()、[ ]、)是成对出现的,并且当括号在表达式中嵌套时,不允许出现交叉现象。检验括号匹配的方法,就是对给定的字符串依次检验:若是左括号,入栈;若是右括号,出栈一个左括号判断是否与之匹配;是其他字符,不检验。检验到字符串尾,还要检查栈是否为空。只有栈空,整个字符串才是括号匹配的。

#include <stdio.h>
#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]!=) { if(str[i]=={||str[i]==[||str[i]==() { Push(S,str[i]); i++; continue; } if(getTop(S,pre)) { if((pre=={&&str[i]==})||(pre==[&&str[i]==])||(pre==(&&str[i]==))) { Pop(S); i++; }else{ printf("匹配错误 "); printf(" "); printf("----------------------end----------------------"); return ERROR; } }else{ printf("栈空了或输入的第一个是左括号 "); printf("----------------------end-------------------------"); return ERROR; } } if(S.top==0){ printf("匹配成功 "); printf(" "); printf("-----------------------end-------------------------"); }else{ printf("匹配错误 "); printf(" "); printf("------------------------end------------------------"); } }

 主函数

#include"StringMatch.h"
int main()
{
    SqStack S;
    Initstack(S);
    Match(S);
}

 

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

Java 栈 如何实现括号匹配

20. Valid Parentheses(用栈实现括号匹配)

Python 用栈判断括号匹配

栈的应用之括号匹配的检验

1354括弧匹配检验

2括弧匹配检验