利用栈结构,对键盘输入任意字符串,判断其中的括号是否匹配。
核心代码:
#include <stdio.h>
#include <iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int Status;
#define MAXSIZE 100
typedef int SElemType;
typedef struct{
SElemType *base;//栈底指针
SElemType *top;//栈顶指针
int stacksize;//栈可用的最大容量
}SqStack;
//栈的初始化
Status InitStack(SqStack &S)
{
//构造一个空栈
S.base=new SElemType[MAXSIZE];//为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
if(!S.base)//存储分配失败
exit (OVERFLOW);
S.top=S.base;//top初始为base,空栈
S.stacksize=MAXSIZE;
return OK;
}
//判断栈空
Status StackElemType(SqStack S)
{
return (S.base==S.top);
}
//出栈
Status Pop(SqStack &S,SElemType &e)
{
//删除栈顶元素,用e返回其值
if(S.top==S.base)
return ERROR;
else
{
e=*--S.top;
return OK;
}
}
//入栈
Status Push(SqStack &S,SElemType e)
{
if(S.top-S.base>=S.stacksize)//栈满
return ERROR;
else
{
*S.top++=e; //元素e压入栈顶,栈顶指针加一
return OK;
}
}
//输入任意字符串,判断其中的括号是否匹配
bool Matching(char str[])
{
SqStack S;
SElemType e;
InitStack(S);
int i=0;
bool flag=true;
while(str[i]!='\0'&&flag)
{
switch (str[i])
{
case '(':
case '[':
case '{': Push(S,str[i]);
break;
case ')':if(Pop(S,e)==ERROR || e!='(')
flag=false;
break;
case ']':if(Pop(S,e)==ERROR || e!='[')
flag=false;
break;
case '}':if(Pop(S,e)==ERROR || e!='{')
flag=false;
break;
}
i++;
}
if(flag&&str[i]=='\0'&&StackElemType(S))
return true;
else return false;
}
int main()
{
char str[256],yn;
do{
cout<<"\n\n===================================";
cout<<"\n 检查括号是否匹配 ";
cout<<"\n===================================";
cout<<"\n\n输入括号串:";
cin>>str;
if(Matching(str))
{
cout<<"\n匹配成功!";
}
else
cout<<"\n匹配失败!";
cout<<"\n\n===================================";
cout<<"\n继续吗?(Y/N):";
cin>>yn;
}while(yn=='Y'||yn=='y');
return 0;
}