您的位置:首页 > 理论基础 > 数据结构算法

C数据结构学习历程(4) 链栈之 括号匹配

2015-11-13 09:38 477 查看
我是参照《严蔚敏数据结构ppt》http://wenku.baidu.com/view/3ff16fc20242a8956aece41d.html以及《严蔚敏c数据结构视频》来写的,因为ppt上有些错,而视频上的代码不全,自己另写了。ppt上错哪,我就不指出了,大家可以对照着看,就能发现不同之处。

因为有注释,我直接copy代码了。也参考了关联的文章 “数据结构实验之栈四:括号匹配

#include<iostream>
using namespace std;
#define OK 1
#define ERROR -1
#define MAX_SIZE 100
typedef int Status;
typedef char ElemType;
typedef struct Stack_Node    //链栈的结点类型说明
{
ElemType data;
struct Stack_Node *next;
}StackNode;
StackNode *Init_Link_Stack()
{
StackNode * top;
top=(StackNode *)malloc(sizeof(StackNode));
top->next=NULL;
return (top);
}
void push(StackNode *top,ElemType e)
{
StackNode *p;
p=(StackNode*)malloc(sizeof(StackNode));
p->data=e;p->next=top->next;
top->next=p;
}
ElemType pop(StackNode*top)
{
if(top->next==NULL)
{cout<<"为空时,不能弹出"<<endl;return -1;}

//ElemType e=top->data ;          //不能这样,因为top是为空栈的
StackNode *p=top->next;
ElemType e=p->data ;
top->next=p->next;
free(p);
return e;

}
ElemType getTop(StackNode *top)
{
return top->next->data;
}
void judge(char a[])    // 给你一串字符,不超过50个字符,可能包括括号、数字、字母、标点符号、空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配。
{
int len=strlen(a);  //遇到的第一个\0
int i;
StackNode *stack=Init_Link_Stack();
for( i=0;i<len;i++)
{
if(a[i]=='('||a[i]=='['||a[i]=='{')
{
push(stack,a[i]);
}
if(a[i]!=')'&&a[i]!=']'&&a[i]!='}')  //输入的不是括号
continue;
if(stack->next==NULL)//有了右半个括号,但是没有左半个括号的情况,因为不能获取最上的数据了,
{
cout<<"no"<<endl;break;
}
if(a[i]-getTop(stack)==1||a[i]-getTop(stack)==2)  //a[i]为3种情况,只要与最上匹配都行的。小括号相差1,大括号与中括号相差2
{
pop(stack);
}
else
{
cout<<"no"<<endl;
break;
}
}
if(i==len)
{
if(stack->next==NULL)
{
cout<<"yes"<<endl;
}
}
}
int main()
{

char *a1="a+(b*c+{(d-3)]})";
char a[7]={'a','+','(','b','*','c',')'};
judge(a1);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: