题目:假设表达式中运序包含圆括号、方括号和大括号3种括号,编写一个算法判断表达式中的括号是否正确配对
思路:运用栈,遇到左边3种括号分别进栈
代码:
#include<stdlib.h>
#include <bits/stdc++.h>
using namespace std;
typedef struct linknode
{
char data;
struct linknode *next;//栈顶指针
}LinkStNode;
void InitStack(LinkStNode *&s)//初始化栈
{
s=(LinkStNode *)malloc(sizeof(LinkStNode));
s->next=NULL;
}
int Pop(LinkStNode *&s,char e)//进栈函数
{
LinkStNode *p;
p=(LinkStNode *)malloc(sizeof(LinkStNode));
p->data=e;
p->next=s->next;
s->next=p;
}
int Push(LinkStNode *&s,char &e)//出栈函数
{
LinkStNode *p;
if(s->next==NULL)
return 0;
else
p=s->next;
e=p->data;
s->next=p->next;
free(p);
return 1;
}
bool GetTop(LinkStNode *s,char &e)
{
if(s->next==NULL)
return false;
e=s->next->data;
return true;
}
bool match(char exp[],int n)
{
int i=0;char e;
bool flag=true;
LinkStNode *t;
InitStack(t);
while(i<n&&flag)
{
if(exp[i]=='{')
Push(t,exp[i]);
else if(exp[i]=='}')
{
if(GetTop(t,e)==true)
{
if(e!='{')
flag=false;
else
Pop(t,e);
}
else flag=false;
}
if(exp[i]=='[')
Push(t,exp[i]);
else if(exp[i]==']')
{
if(GetTop(t,e)==true)
{
if(e!='[')
flag=false;
else
Pop(t,e);
}
else flag=false;
}
if(exp[i]=='(')
Push(t,exp[i]);
else if(exp[i]==')')
{
if(GetTop(t,e)==true)
{
if(e!='(')
flag=false;
else
Pop(t,e);
}
else flag=false;
}
i++;
}
return flag;
}
}
int main()
{
LinkStNode *s;
s=(LinkStNode *)malloc(sizeof(LinkStNode));
InitStack(s);
char a[10];
cout<<"请输入要配对的字符串(不超过10):"<<endl;
for(int i=0;getchar()!='\n';i++)
{
cin>>a[i];
}
if(match(a,10)==true)
cout<<"Success";
else
cout<<"false";
return 1;
}
运行结果:
总结:栈是一个很好的工具,因为具有先进后出的性质,可以用来解决许多顺序问题