Problem A: 括号匹配(栈和队列)
Description
假设一个算术表达式中可以包含三种括号:圆括号“(”和“)”,方括号“[”和“]”和花括号“{”和“ ”,且这三种括号可按任意的次序嵌套使用(如:…[…{… …[…]…]…[…]…(…)…)。编写判别给定表达式中所含括号是否正确配对出现的算法。输出结果YES 或者 NO。
Input
5+{[2X5]+2}
Output
YES
Sample Input
8-[{2+7]}
Sample Output
NO
数据结构栈的简单应用:
如果出现‘[’,‘(’,,{',时使左括号入栈,若出现右括号')',‘]’,‘}’,时,先判断栈是否为空,若为空则肯定不匹配,若不为空则取出栈顶元素c,如果c和当前的右括号匹配,则左括号出栈,否则括号不匹配。(自我认为这样是从内向外找的匹配)
代码:
数据结构栈的简单应用:
如果出现‘[’,‘(’,,{',时使左括号入栈,若出现右括号')',‘]’,‘}’,时,先判断栈是否为空,若为空则肯定不匹配,若不为空则取出栈顶元素c,如果c和当前的右括号匹配,则左括号出栈,否则括号不匹配。(自我认为这样是从内向外找的匹配)
代码:
#include <iostream>
#include<string.h>
using namespace std;
struct node
{
char ch;
node *next;
} *head;
node* instack(char c)//某个元素入栈
{
node *p;
static int count1=0;
if(count1==0)
{
p=new node;
p->ch=c;
p->next=NULL;
count1++;
return p;
}
else
{
p=new node;
p->ch=c;
p->next=head;
return p;
}
}
void stack_pop()//栈顶的元素出栈
{
node *p;
// char c;
// c=head->ch;
p=head;
head=head->next;
delete p;
//return c;
}
char stack_top()//取出栈顶元素
{
return head->ch;
}
bool stack_empty()//判断栈是否为空
{
if(head==NULL)
return true;
return false;
}
int main()
{
int i,k;
char s[101],c;
bool YON=true;
while(cin>>s)
{
k=strlen(s);
for(i=0; i<k; i++)
{
if(s[i]=='('||s[i]=='['||s[i]=='{')//出现左括号则入栈
{
head=instack(s[i]);
}
if(s[i]==')'||s[i]==']'||s[i]=='}')/出现右括号
{
if(!stack_empty())//判断是否为空
{
c=stack_top();//取出栈顶元素
if(!((s[i]==']'&&c=='[')||(s[i]=='}'&&c=='{')||(s[i]==')'&&c=='(')))//判断是否匹配
{
YON=false;
break;
}
else stack_pop();//匹配则栈顶元素出栈
}
else
{
YON=false;
break;
}
}
}
if(YON)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
memset(s,'\0',sizeof(s));
}
return 0;
}