
(C语言)数据结构之括号匹配的问题
#include<stdio.h>#include<stdlib.h>#include<iostream.h>#defineERROR0#defineFALSE0#def...
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#define ERROR 0
#define FALSE 0
#define OVERFLOW -1
#define OK 1
#define STACK_INIT_SIZE 100
#define STACK_ADD 10
#define LEFT 6
#define RIGHT 9
typedef int Status;
typedef char Elemtype;
struct Stack{
Elemtype *base;
Elemtype *top;
int stacksize;
};
Status InitStack(Stack &s)
{
s.base=(Elemtype *)malloc(STACK_INIT_SIZE*sizeof(Elemtype));
if(!s.base)
exit(OVERFLOW);
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
return OK;
}
Status Empty_Stack(Stack &s)
{
if(s.top==s.base)
return OK;
else
return ERROR;
}
Status PushStack(Stack &s,Elemtype &elem)
{
if(s.top-s.base>=s.stacksize)
s.base=(Elemtype *)realloc(s.base,(s.stacksize+STACK_ADD)*sizeof(Elemtype));
if(!s.base)
exit(OVERFLOW);
s.top=s.base+s.stacksize;
s.stacksize+=STACK_ADD;
*s.top++=elem;
return OK;
}
Status PopStack(Stack &s)
{
if(s.top<=s.base)
return ERROR;
--s.top;
return OK;
}
Status MacthStack_elem(Stack &s,Elemtype elem)
{
int i,j;
char left[]={'(','{','['},right[]={')','}',']'};
for(i=0;i<3;i++)
if(*(s.top-1)==left[i])
{
j=i;
break;
}
if(right[j]==elem)
return OK;
else
return FALSE;
}
Status JudgeStack_elem(Elemtype elem)
{
int i;
char left[]={'(','{','['},right[]={')','}',']'};
for(i=0;i<3;i++){
if(elem==left[i])
return LEFT;
else if(elem==right[i])
return RIGHT;
}
}
int main()
{
Stack S;
Elemtype e;
InitStack(S);
int flag;
while(scanf("%c",&e)!=EOF)
{
flag=JudgeStack_elem(e);
if(flag==6) //判断:如果是左括号,则压入栈中
PushStack(S,e);
else if(flag==9)//如果是右括号
{
if(!Empty_Stack(S)&&MacthStack_elem(S,e)){//若栈不为空,则判断是否匹配
PopStack(S); //匹配成功,弹栈
}
else
PushStack(S,e);
}
}
if(Empty_Stack(S))
printf("Yes\n");
else
printf("No\n");
return 0;
}
程序意图:
当输入一个字符,while语句中条件成立
接下来就是判断是否为左右括号,
如果是左:入栈,
为右且栈不为空:则判断是否与栈的头指针匹配,匹配成功则出栈!
否则:入栈
如果条件不满足,则判断栈是否为空,为空则匹配。
但不知道什么原因导致程序无法出结果?
不知道是不是while(scanf("%c",&e)!=EOF)这条语句的问题,所以,还请高手你指点下,多谢啦。
还有个问题:就是我的C—free编译器的大纲栏无法显示main()函数和其他的函数 展开
#include <stdlib.h>
#include <iostream.h>
#define ERROR 0
#define FALSE 0
#define OVERFLOW -1
#define OK 1
#define STACK_INIT_SIZE 100
#define STACK_ADD 10
#define LEFT 6
#define RIGHT 9
typedef int Status;
typedef char Elemtype;
struct Stack{
Elemtype *base;
Elemtype *top;
int stacksize;
};
Status InitStack(Stack &s)
{
s.base=(Elemtype *)malloc(STACK_INIT_SIZE*sizeof(Elemtype));
if(!s.base)
exit(OVERFLOW);
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
return OK;
}
Status Empty_Stack(Stack &s)
{
if(s.top==s.base)
return OK;
else
return ERROR;
}
Status PushStack(Stack &s,Elemtype &elem)
{
if(s.top-s.base>=s.stacksize)
s.base=(Elemtype *)realloc(s.base,(s.stacksize+STACK_ADD)*sizeof(Elemtype));
if(!s.base)
exit(OVERFLOW);
s.top=s.base+s.stacksize;
s.stacksize+=STACK_ADD;
*s.top++=elem;
return OK;
}
Status PopStack(Stack &s)
{
if(s.top<=s.base)
return ERROR;
--s.top;
return OK;
}
Status MacthStack_elem(Stack &s,Elemtype elem)
{
int i,j;
char left[]={'(','{','['},right[]={')','}',']'};
for(i=0;i<3;i++)
if(*(s.top-1)==left[i])
{
j=i;
break;
}
if(right[j]==elem)
return OK;
else
return FALSE;
}
Status JudgeStack_elem(Elemtype elem)
{
int i;
char left[]={'(','{','['},right[]={')','}',']'};
for(i=0;i<3;i++){
if(elem==left[i])
return LEFT;
else if(elem==right[i])
return RIGHT;
}
}
int main()
{
Stack S;
Elemtype e;
InitStack(S);
int flag;
while(scanf("%c",&e)!=EOF)
{
flag=JudgeStack_elem(e);
if(flag==6) //判断:如果是左括号,则压入栈中
PushStack(S,e);
else if(flag==9)//如果是右括号
{
if(!Empty_Stack(S)&&MacthStack_elem(S,e)){//若栈不为空,则判断是否匹配
PopStack(S); //匹配成功,弹栈
}
else
PushStack(S,e);
}
}
if(Empty_Stack(S))
printf("Yes\n");
else
printf("No\n");
return 0;
}
程序意图:
当输入一个字符,while语句中条件成立
接下来就是判断是否为左右括号,
如果是左:入栈,
为右且栈不为空:则判断是否与栈的头指针匹配,匹配成功则出栈!
否则:入栈
如果条件不满足,则判断栈是否为空,为空则匹配。
但不知道什么原因导致程序无法出结果?
不知道是不是while(scanf("%c",&e)!=EOF)这条语句的问题,所以,还请高手你指点下,多谢啦。
还有个问题:就是我的C—free编译器的大纲栏无法显示main()函数和其他的函数 展开
1个回答
展开全部
无法出结果是因为没有正常终止输入:要使scanf("%c",&e)==EOF这个条件满足,只要输入完括号后,回车,按一次F6或CTRL+z,回车,再按一次F6或CTRL+z,回车,就能看到结果。好像你的程序答案有问题。
没用过C—free编译器,不知道你说的这种情况是怎么回事
没用过C—free编译器,不知道你说的这种情况是怎么回事
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询