使用堆栈实现括号的匹配
2013-07-18 23:40
423 查看
#include <string.h>
#include<stdio.h>
typedef char DataType;
#define MaxSize 10
typedef struct
{
DataType stack [MaxSize];
int top;
}sstack;
//堆栈的初始化
void StackInit(sstack *s)
{
s->top=0; //定义指针变量,他指向的变量的成员变量为0;
}
//插入数据
int StackInsert(sstack*s,DataType x)
{
if(s->top>MaxSize)
{
printf("堆栈已满不能插如");
return 0;
}
else
{
s->stack[s->top]=x;
s->top++;
return 1;
}
}
//判断堆栈是否为空
int StackNe(sstack s)
{
if(s.top<=0)
{
return 0;
}
else
{
return 1;
}
}
//出栈
int StackDelete(sstack *s,DataType *x)
{
if(s->top<=0)
{
printf("堆栈为空");
return 0;
}
else
{ s->top--;
*x=s->stack[s->top];
return 1;
}
}
//取出栈顶元素
int StackGet(sstack s, DataType *x)
{
if(s.top<0)
{
printf("堆栈为空");
return 0;
}
else
{
*x=s.stack[s.top-1];
return 1;
}
}
//函数实现括号的匹配
void pipei(char ele[],int n)
{ int i;
sstack mystack;
char c;
//初始化栈
StackInit(&mystack);
for(i=0;i<n;i++)
{
//如果是左括号则入栈
if((ele[i]=='{')||(ele[i]=='[')||(ele[i]=='('))
{
StackInsert(&mystack,ele[i]) ;
}
//如果是有括号则进行匹配,如果不是空的而且是在栈顶则出栈,说明他们是匹配的。
else if((ele[i])==')'&&StackNe(mystack)&&StackGet(mystack,&c)&&c=='(')
{
//如果是匹配的则出栈
StackDelete(&mystack,&c);
printf("()\t");
}
else if((ele[i])==')'&&StackNe(mystack)&&StackGet(mystack,&c)&&c!='(')
{
printf("括号匹配不正确\n");
return ;
}
//[][][][][][]]]]]]]][[[[[[[[[[[[[[]]]]]]]]]]]]][[[[[[[[[[]]]]]
else if((ele[i])==']'&&StackNe(mystack)&&StackGet(mystack,&c)&&c=='[')
{
//如果是匹配的则出栈
StackDelete(&mystack,&c);
//printf("括号是匹配的");
printf("[] \t");
}
else if((ele[i])==']'&&StackNe(mystack)&&StackGet(mystack,&c)&&c!='[')
{
printf("括号匹配不正确 \n");
return ;
}
//{{{{{{{{{{{{}}}}}}}}}}}}}}}}}}}}{{{{{{{{{{{{{{{{{{{{{{}}}}}}}}}}}}
else if((ele[i])=='}'&&StackNe(mystack)&&StackGet(mystack,&c)&&c=='{')
{
//如果是匹配的则出栈
StackDelete(&mystack,&c);
//printf("括号匹配真确 \n");
printf("{} \t");
}
else if((ele[i])=='}'&&StackNe(mystack)&&StackGet(mystack,&c)&&c!='{')
{
printf("括号匹配不正确 \n");
return ;
}
else if((ele[i]==')')||(ele[i]==']')||(ele[i]=='}')&&!StackNe(mystack))
{
printf("右括号多于左括号! \n");
}
}
if(StackNe(mystack))
{
printf("左括号多于右括号! \n");
}
else
{
printf("括号匹配正确!\n");
}
}
int main ()
{
char a[]={'{','[','(',')',']','}'} ;
char b[]={'{','{','[','(',')',']','}'};
pipei(b,10);
return 0;
}
#include<stdio.h>
typedef char DataType;
#define MaxSize 10
typedef struct
{
DataType stack [MaxSize];
int top;
}sstack;
//堆栈的初始化
void StackInit(sstack *s)
{
s->top=0; //定义指针变量,他指向的变量的成员变量为0;
}
//插入数据
int StackInsert(sstack*s,DataType x)
{
if(s->top>MaxSize)
{
printf("堆栈已满不能插如");
return 0;
}
else
{
s->stack[s->top]=x;
s->top++;
return 1;
}
}
//判断堆栈是否为空
int StackNe(sstack s)
{
if(s.top<=0)
{
return 0;
}
else
{
return 1;
}
}
//出栈
int StackDelete(sstack *s,DataType *x)
{
if(s->top<=0)
{
printf("堆栈为空");
return 0;
}
else
{ s->top--;
*x=s->stack[s->top];
return 1;
}
}
//取出栈顶元素
int StackGet(sstack s, DataType *x)
{
if(s.top<0)
{
printf("堆栈为空");
return 0;
}
else
{
*x=s.stack[s.top-1];
return 1;
}
}
//函数实现括号的匹配
void pipei(char ele[],int n)
{ int i;
sstack mystack;
char c;
//初始化栈
StackInit(&mystack);
for(i=0;i<n;i++)
{
//如果是左括号则入栈
if((ele[i]=='{')||(ele[i]=='[')||(ele[i]=='('))
{
StackInsert(&mystack,ele[i]) ;
}
//如果是有括号则进行匹配,如果不是空的而且是在栈顶则出栈,说明他们是匹配的。
else if((ele[i])==')'&&StackNe(mystack)&&StackGet(mystack,&c)&&c=='(')
{
//如果是匹配的则出栈
StackDelete(&mystack,&c);
printf("()\t");
}
else if((ele[i])==')'&&StackNe(mystack)&&StackGet(mystack,&c)&&c!='(')
{
printf("括号匹配不正确\n");
return ;
}
//[][][][][][]]]]]]]][[[[[[[[[[[[[[]]]]]]]]]]]]][[[[[[[[[[]]]]]
else if((ele[i])==']'&&StackNe(mystack)&&StackGet(mystack,&c)&&c=='[')
{
//如果是匹配的则出栈
StackDelete(&mystack,&c);
//printf("括号是匹配的");
printf("[] \t");
}
else if((ele[i])==']'&&StackNe(mystack)&&StackGet(mystack,&c)&&c!='[')
{
printf("括号匹配不正确 \n");
return ;
}
//{{{{{{{{{{{{}}}}}}}}}}}}}}}}}}}}{{{{{{{{{{{{{{{{{{{{{{}}}}}}}}}}}}
else if((ele[i])=='}'&&StackNe(mystack)&&StackGet(mystack,&c)&&c=='{')
{
//如果是匹配的则出栈
StackDelete(&mystack,&c);
//printf("括号匹配真确 \n");
printf("{} \t");
}
else if((ele[i])=='}'&&StackNe(mystack)&&StackGet(mystack,&c)&&c!='{')
{
printf("括号匹配不正确 \n");
return ;
}
else if((ele[i]==')')||(ele[i]==']')||(ele[i]=='}')&&!StackNe(mystack))
{
printf("右括号多于左括号! \n");
}
}
if(StackNe(mystack))
{
printf("左括号多于右括号! \n");
}
else
{
printf("括号匹配正确!\n");
}
}
int main ()
{
char a[]={'{','[','(',')',']','}'} ;
char b[]={'{','{','[','(',')',']','}'};
pipei(b,10);
return 0;
}
相关文章推荐
- 使用堆栈实现括号的匹配
- 使用堆栈来实现括号匹配的检查
- 使用栈的链式表示,实现括号匹配检测。
- 简单算法——使用栈实现括号匹配检验
- 使用栈实现括号匹配
- 算法复习--------------利用堆栈实现括号匹配
- 不用堆栈实现的括号匹配
- 用堆栈实现括号匹配——ADT实现
- 面试算法:使用堆栈判断括号的匹配
- 用堆栈来实现括号匹配的比较
- 自定义堆栈,实现括号匹配
- 用堆栈实现给定数学表达式括号是否匹配 推荐
- 判断表达式括号是否匹配,C语言堆栈实现
- 对如下字符串(234453)[234]{2324}分析它的括号使用是否正确,括号匹配(Java实现)
- 考研数据结构与算法之堆栈的使用(三)利用堆栈匹配括号
- Java堆栈的应用1----------堆栈的自定义实现以及括号匹配算法的Java实现
- 使用栈来实现括号匹配
- Python 使用堆栈验证C文件括号是否匹配
- 使用栈实现括号匹配算法-java
- 题目1153:括号匹配问题(2010年北京大学计算机研究生机试真题,堆栈的使用)