-
问题描述
已知以字符型顺序表表示的表达式含有三种扩号“(”、“)”、“ “[” 、“]” 、“{” 和“}” ,它们可嵌套使用,试写出算法判断给定表达式中所含扩号是否正确配对出现。
-
代码实现
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
char data;
struct LNode *next;
}LNode;
void Push(LNode *s,char a);
int Pop(LNode *s,char *a);
int main(void)
{
char read='r',judge='j',*j;
j=&judge;
LNode *s;
s=(LNode*)malloc(sizeof(LNode));
s->data='S';
s->next=NULL;
printf("请输入表达式:\n");
while( read!='\n' )
{
read=getchar();
if( read == '(' || read =='[' || read =='{' ) Push(s,read);
if( read == ')' || read ==']' || read =='}' )
{
if(Pop(s,j))
{
switch (*j)
{
case '(' : judge=')'; break;
case '[' : judge=']'; break;
case '{' : judge='}'; break;
}
if(judge!=read)
{
printf("ERROR! 不匹配!!!");
break;
}
}
else
{
printf("ERROR! 不匹配!!!");
break;
}
}
}
if(s->next==NULL&&read=='\n') printf("RIGHT! 匹配!!!");
else if(s->next!=NULL&&read=='\n') printf("ERROR! 不匹配!!!");
return 0;
}
void Push(LNode *s,char a)
{
LNode *r=(LNode*)malloc(sizeof(LNode));
r->next=NULL;
r->data=a;
r->next=s->next;
s->next=r;
}
int Pop(LNode *s,char *a)
{
LNode *p;
if(s->next!=NULL)
{
p=s->next;
*a=p->data;
s->next=p->next;
free(p);
return 1;
}
else return 0;
}
-
知识总结
- 栈的定义:一种只能在一端进行插入或删除操作的线性表。
- 栈的特点:先进后出。
- 存储结构:顺序栈和链式栈。
- 当n个元素以某种顺序进栈,并且可在任意时刻出栈时,所获得元素排列的数目恰好满足函数Catalan()的计算, 即N=
。