Description
假设一个算术表达式中可以包含三种括号:圆括号“( ”和“ )”、方括号“ [ ”和“ ] ”和花括号“{”和“}”,且这三种括号可按任意的次序嵌套使用(如:…[…{…}…[…]…]…[…]…(…)…)。编写判别给定表达式中所含括号是否正确配对出现的程序(已知表达式已存入数据元素为字符的顺序表中)。
Input
输入算术表达式,换行结束。
Output
若给定表达式中所含括号正确配对,则输出yes,否则输出no。
-
Sample Input
[5+(6-3)]-(2+3)]
-
Sample Output
no
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct Stack{
char data;
struct Stack *next;
}Stack;
Stack *create(){
Stack *q=(Stack *)malloc(sizeof(Stack));
q->next=NULL;
return q;
}
char getTop(Stack *s){
return s->next->data;
}
int equals(char a,char b){
if(a=='('&&b==')')return 1;
if(a=='['&&b==']')return 1;
if(a=='{'&&b=='}')return 1;
return 0;
}
void pop(Stack *s){
Stack *q=s->next;
s->next=q->next;
free(q);
}
void push(Stack *s,char b){
Stack *q=(Stack *)malloc(sizeof(Stack));
q->data=b;
q->next=s->next;
s->next=q;
}
int isEmpty(Stack *s){
if(s->next==NULL)return 1;
return 0;
}
int main(){
char str[105];
scanf("%s",str);
int i=0;
int len=strlen(str);
Stack *s=create();
if(str[0]=='['||str[0]==']'||str[0]=='{'||str[0]=='}'||str[0]=='('||str[0]==')')
push(s,str[0]);
for(i=1;i<len;i++){
if(!isEmpty(s)&&equals(getTop(s),str[i]))
{
pop(s);
}
else
{
if(str[i]=='['||str[i]==']'||str[i]=='{'||str[i]=='}'||str[i]=='('||str[i]==')')
push(s,str[i]);
}
}
if(isEmpty(s)){
printf("yes\n");
}else{
printf("no\n");
}
return 0;
}
略有差别的第二种写法,加入了头指针
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
typedef struct node{
char data;
struct node *next;
struct node *top;
}Stack;
Stack *Create()
{
Stack *q = (Stack *)malloc(sizeof(Stack));
q->top = NULL;
return q;
}
void push(Stack *s,char x)
{
Stack *q = (Stack *)malloc(sizeof(Stack));
q->data = x;
q->next = s->top;
s->top = q;
}
void pop(Stack *s)
{
Stack *q = (Stack *)malloc(sizeof(Stack));
q = s->top;
int elem = s->data;
s->top = s->top->next;
free(q);
}
char getTop(Stack *s)
{
return s->top->data;
}
int isEmpty(Stack *s)
{
return (s->top == NULL);
}
int equals(char a,char b)//不能是a==b,是要匹配
{
if(a=='('&&b==')')return 1;
if(a=='['&&b==']')return 1;
if(a=='{'&&b=='}')return 1;
return 0;
}
int main()
{
char str[105];
scanf("%s",str);
int i=0;
int len=strlen(str);
Stack *s=Create();
if(str[0]=='['||str[0]==']'||str[0]=='{'||str[0]=='}'||str[0]=='('||str[0]==')')
push(s,str[0]);
for(i=1;i<len;i++){
if(!isEmpty(s)&&equals(getTop(s),str[i]))
{
pop(s);
}
else
{
if(str[i]=='['||str[i]==']'||str[i]=='{'||str[i]=='}'||str[i]=='('||str[i]==')')
push(s,str[i]);
}
}
if(isEmpty(s))
{
printf("yes\n");
}
else{
printf("no\n");
}
return 0;
}