数据结构-使用栈进行括号匹配算法
2011-07-08 12:10
621 查看
#include<stdio.h>
#include<stdlib.h>
typedef char ElemType;
//栈的定义
typedef struct linknode
{
ElemType data;
struct linknode * next;
}LinkStack;
void InitStack(LinkStack * &s);//栈的初始化
void ClearStack(LinkStack * &s);//栈的销毁
int StackLength(LinkStack * s);//求栈的长度
int StackEmpty(LinkStack *s);//判断栈是否是空栈
void Push(LinkStack * &s,ElemType e);//进栈
int Pop(LinkStack * &s,ElemType &e);//出栈
int GetTop(LinkStack * s,ElemType &e);//取栈顶元素
void DisplayStack(LinkStack * s);//显示栈里面的元素
int Match(ElemType exp[],int n);//串括号的匹配
void main()
{
ElemType c[5]={'(','a','+','b',')'};
if(Match(c,5))
{
printf("该串括号是匹配的 \n");
}
else
{
printf("该串括号不是匹配的 \n");
}
}
//栈的初始化
void InitStack(LinkStack * &s)
{
s=(LinkStack *)malloc(sizeof(LinkStack));
s->next=NULL;
}
//栈的销毁
void ClearStack(LinkStack * &s)
{
LinkStack * p=s,*q=s->next;
while(q!=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p);
}
//求栈的长度
int StackLength(LinkStack * s)
{
int n=0;
LinkStack *p;
p=s->next;
while(p!=NULL)
{
n++;
p=p->next;
}
return(n);
}
//判断栈是否是空栈
int StackEmpty(LinkStack * s)
{
return(s->next==NULL);
}
//进栈(头插入法)
void Push(LinkStack * &s,ElemType e)
{
LinkStack *p;
p=(LinkStack *)malloc(sizeof(LinkStack));
p->data=e;
p->next=s->next;
s->next=p;
}
//出栈
int Pop(LinkStack * &s,ElemType &e)
{
LinkStack *p;
if(s->next==NULL)
{
return 0;
}
p=s->next;
e=p->data;
s->next=p->next;
free(p);
return 1;
}
//取栈顶元素
int GetTop(LinkStack * s,ElemType &e)
{
if(s->next==NULL)
{
return 0;
}
e=s->next->data;
return 1;
}
//显示栈里面的元素
void DisplayStack(LinkStack * s)
{
LinkStack *p=s->next;
while(p!=NULL)
{
printf(" %c ",p->data);
p=p->next;
}
printf("\n");
}
//判断括号是否配对
int Match(ElemType exp[],int n)
{
int i=0;
ElemType e;
LinkStack * st;
InitStack(st);
while(i<n)
{
if(exp[i]=='(')
{
Push(st,exp[i]);
}
else if(exp[i]==')')
{
if(GetTop(st,e)==1)
{
if(e!='(')
{
return 0;
}
else
{
Pop(st,e);
}
}
else
{
return 0;
}
}
i++;
}
if(StackEmpty(st)==1)
{
return 1;
}
else
{
return 0;
}
}
#include<stdlib.h>
typedef char ElemType;
//栈的定义
typedef struct linknode
{
ElemType data;
struct linknode * next;
}LinkStack;
void InitStack(LinkStack * &s);//栈的初始化
void ClearStack(LinkStack * &s);//栈的销毁
int StackLength(LinkStack * s);//求栈的长度
int StackEmpty(LinkStack *s);//判断栈是否是空栈
void Push(LinkStack * &s,ElemType e);//进栈
int Pop(LinkStack * &s,ElemType &e);//出栈
int GetTop(LinkStack * s,ElemType &e);//取栈顶元素
void DisplayStack(LinkStack * s);//显示栈里面的元素
int Match(ElemType exp[],int n);//串括号的匹配
void main()
{
ElemType c[5]={'(','a','+','b',')'};
if(Match(c,5))
{
printf("该串括号是匹配的 \n");
}
else
{
printf("该串括号不是匹配的 \n");
}
}
//栈的初始化
void InitStack(LinkStack * &s)
{
s=(LinkStack *)malloc(sizeof(LinkStack));
s->next=NULL;
}
//栈的销毁
void ClearStack(LinkStack * &s)
{
LinkStack * p=s,*q=s->next;
while(q!=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p);
}
//求栈的长度
int StackLength(LinkStack * s)
{
int n=0;
LinkStack *p;
p=s->next;
while(p!=NULL)
{
n++;
p=p->next;
}
return(n);
}
//判断栈是否是空栈
int StackEmpty(LinkStack * s)
{
return(s->next==NULL);
}
//进栈(头插入法)
void Push(LinkStack * &s,ElemType e)
{
LinkStack *p;
p=(LinkStack *)malloc(sizeof(LinkStack));
p->data=e;
p->next=s->next;
s->next=p;
}
//出栈
int Pop(LinkStack * &s,ElemType &e)
{
LinkStack *p;
if(s->next==NULL)
{
return 0;
}
p=s->next;
e=p->data;
s->next=p->next;
free(p);
return 1;
}
//取栈顶元素
int GetTop(LinkStack * s,ElemType &e)
{
if(s->next==NULL)
{
return 0;
}
e=s->next->data;
return 1;
}
//显示栈里面的元素
void DisplayStack(LinkStack * s)
{
LinkStack *p=s->next;
while(p!=NULL)
{
printf(" %c ",p->data);
p=p->next;
}
printf("\n");
}
//判断括号是否配对
int Match(ElemType exp[],int n)
{
int i=0;
ElemType e;
LinkStack * st;
InitStack(st);
while(i<n)
{
if(exp[i]=='(')
{
Push(st,exp[i]);
}
else if(exp[i]==')')
{
if(GetTop(st,e)==1)
{
if(e!='(')
{
return 0;
}
else
{
Pop(st,e);
}
}
else
{
return 0;
}
}
i++;
}
if(StackEmpty(st)==1)
{
return 1;
}
else
{
return 0;
}
}
相关文章推荐
- 数据结构13: 括号匹配算法及C语言实现
- 堆栈数据结构应用之括号匹配检查(算法3.2.2)
- 简单算法——使用栈实现括号匹配检验
- 数据结构的应用——使用栈实现字符串括号匹配检查
- PHP数据结构之六 PHP栈的应用举例【数制转换和括号匹配算法】
- 考研数据结构与算法之堆栈的使用(三)利用堆栈匹配括号
- 使用栈来演示括号匹配的算法
- 使用栈实现括号匹配算法-java
- imooc数据结构探险-栈篇 栈应用括号匹配二 由群友启发改良james_yuan老师算法
- 使用传统算法进行表达式求值(数字支持科学表示法,操作符支持加减乘除乘方, 支持括号, 不支持函数)
- 飘逸的python - 使用图像匹配SIFT算法进行LOGO检测
- C语言数据结构之利用栈进行括号匹配的检验
- 面试算法:使用堆栈判断括号的匹配
- 基本数据结构和算法在Linux内核中使用
- jenkins远程部署使用shell脚本进行备份与find和grep匹配的区别
- Android-使用MultiAutoCompleteTextView进行分隔符动态匹配
- 请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量)。 给定一个string iniString,请返回一个string,为翻转后的字符串。保证字符串的
- opencv3.2——小试牛刀(1):使用鼠标选择ROI进行SURF匹配
- 数据结构(C++) 栈-括号匹配与中缀转后缀
- 数据结构 括号匹配问题 (栈 C语言)