/*作业4:括号匹配的检验
假设表达式中允许包含两种括号:圆括号和方括号,其嵌入的顺序随意。设计一个算法采用顺序栈判断表达式中的括号是否正确配对,并编程实现。*/
/*思路:利用栈的先进后出,当识别'['&'('时压入栈,']'&')'时与栈顶元素比较,如果栈顶元素为'['&')'时弹出栈顶元素直至识别定义的结束符'#',结束进出栈的操作,检测栈内元素是否为空,为空则匹配正确(因为都消掉了),否则失败*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node{
char data;
struct node*next;
}node,*LinkList;
//初始化
LinkList creat(){
LinkList p;
p=(node*)malloc(sizeof(node));
if(p!=NULL){
p->next=NULL;
}
return p;
}
//判断是否为空
int StackEmpty(LinkList p){
if(p->next==NULL)
return 1;
else
return 0;
}
//压入栈
void Push(LinkList p,char x){
LinkList s;
s=(node*)malloc(sizeof(node));
s->data=x;
s->next=p->next;
p->next=s;
}
//出栈
void Pop(LinkList p,char *x){
LinkList s;
*x=p->data;
s=p->next;
p->next=s->next;
free(s);
}
//取栈顶元素
char GetTop(LinkList p){
if(p->next)
return p->next->data;
return 0;
}
int main(){
LinkList top;
char ch,t;
int flag=1;
top=creat();
printf("please enter the number(end of''#'):\n");
ch=getchar();
while(ch!='#'&&flag){
switch(ch){
case'[':
case'(':
Push(top,ch);
break;
case']':
if(!StackEmpty(top)&&GetTop(top)=='[')
Pop(top,&t);
else
flag=0;
break;
case')':
if(!StackEmpty(top)&&GetTop(top)==')')
Pop(top,&t);
else
flag=0;
break;
}
ch=getchar();
}
if(StackEmpty(top)&&flag)
printf("yes\n");
else printf("no\n");
return 0;
}
结果如下: