主题:高手请进,帮我看看括号匹配程序哪出了错
zjkzxy
[专家分:310] 发布于 2006-03-30 17:54:00
#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
typedef int Status;
//------栈的顺序存储表示------------
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct
{int *base;
int *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &s)
{//构造一个空栈
s.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
if(!s.base) return ERROR;
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
return OK;
}
Status push(SqStack &s,char e)
{//插入e为新的栈顶元素
if(s.top-s.base>=s.stacksize)
{s.base=(int *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(int));
if(!s.base) return ERROR;
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top++=e;
return OK;
}
Status pop(SqStack &s,char &e)
{//若栈不空,则删除S的栈顶元素,用e返回其值,并返回炽OK;否则返回ERROR
if(s.base==s.top) return ERROR;
e=*--s.top;
return OK;
}
Status StackEmpty(SqStack s)
{if(s.base==s.top) return 1;
else return 0;
}
main()
{char ch1,ch2,c[100];int i;
SqStack s;
printf("请输入包括括号表达式:");
scanf("%s",c);
i=0;
while(ch1=c[i])
{if(ch1=='('||ch1=='{'||ch1=='[')
push(s,ch1);
if(ch1==')' ||ch1==']' ||ch1=='}')
if(StackEmpty(s)) {return ERROR;printf("表达式中的括号不匹配!");}
else {pop(s,ch2);
if(ch1=='(' && ch2!=')') {return ERROR;printf("表达式中的括号不匹配!");}
if(ch1=='[' && ch2!=']') {return ERROR;printf("表达式中的括号不匹配!");}
if(ch1=='{' && ch2!='}') {return ERROR;printf("表达式中的括号不匹配!");}
}
i++;
}
if(!StackEmpty(s)) return ERROR;
printf("表达式中的括号匹配!");
}
以上程序,可以通过,但是调试不出结果,麻烦高手们指点一下!
回复列表 (共9个回复)
沙发
rickone [专家分:15390] 发布于 2006-03-30 18:09:00
结构有些模糊:
while(ch1=c[i++])//这样写不是很好吗?
{if(ch1=='('||ch1=='{'||ch1=='[')
push(s,ch1);
else if(ch1==')' ||ch1==']' ||ch1=='}')
{ if(StackEmpty(s)) {return ERROR;printf("表达式中的括号不匹配!");}
pop(s,ch2);
if(ch2=='(' && ch1!=')') {return ERROR;printf("表达式中的括号不匹配!");}
if(ch2=='[' && ch1!=']') {return ERROR;printf("表达式中的括号不匹配!");}
if(ch2=='{' && ch1!='}') {return ERROR;printf("表达式中的括号不匹配!");}
}
}
ch1是从串里出来的应该是右括号,ch2从栈里出来应该是左括号。
板凳
rickone [专家分:15390] 发布于 2006-03-30 18:10:00
if(StackEmpty(s)) {return ERROR;printf("表达式中的括号不匹配!");}
再改成
if(StackEmpty(s)) {printf("表达式中的括号不匹配!");return ERROR;}
3 楼
zjkzxy [专家分:310] 发布于 2006-03-30 18:22:00
#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
typedef int Status;
//------栈的顺序存储表示------------
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct
{int *base;
int *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &s)
{//构造一个空栈
s.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
if(!s.base) return ERROR;
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
return OK;
}
Status push(SqStack &s,char e)
{//插入e为新的栈顶元素
if(s.top-s.base>=s.stacksize)
{s.base=(int *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(int));
if(!s.base) return ERROR;
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top++=e;
return OK;
}
Status pop(SqStack &s,char &e)
{//若栈不空,则删除S的栈顶元素,用e返回其值,并返回炽OK;否则返回ERROR
if(s.base==s.top) return ERROR;
e=*--s.top;
return OK;
}
Status StackEmpty(SqStack s)
{if(s.base==s.top) return 1;
else return 0;
}
main()
{char ch1,ch2,c[100];int i;
SqStack s;
InitStack(s);
printf("请输入包括括号表达式:");
scanf("%s",c);
i=0;
while(ch1=c[ii++])
{if(ch1=='('||ch1=='{'||ch1=='[')
push(s,ch1);
else if(ch1==')' ||ch1==']' ||ch1=='}')
if(StackEmpty(s)) {printf("表达式中的括号不匹配!\n");return ERROR;}
else {pop(s,ch2);
if(ch2=='(' && ch1!=')') {printf("表达式中的括号不匹配!\n");return ERROR;}
if(ch2=='[' && ch1!=']') {printf("表达式中的括号不匹配!\n");return ERROR;}
if(ch2=='{' && ch1!='}') {printf("表达式中的括号不匹配!\n");return ERROR;}
}
}
if(!StackEmpty(s)) {printf("表达式中的括号不匹配!\n"); return ERROR;}
printf("表达式中的括号匹配!");
printf("\n");
}
谢谢,我调试出来了,把程序发给大家
4 楼
zjkzxy [专家分:310] 发布于 2006-03-30 18:30:00
经过高手的指点,再把改进的给大家传过来
#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
typedef int Status;
//------栈的顺序存储表示------------
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct
{int *base;
int *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &s)
{//构造一个空栈
s.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
if(!s.base) return ERROR;
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
return OK;
}
Status push(SqStack &s,char e)
{//插入e为新的栈顶元素
if(s.top-s.base>=s.stacksize)
{s.base=(int *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(int));
if(!s.base) return ERROR;
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top++=e;
return OK;
}
Status pop(SqStack &s,char &e)
{//若栈不空,则删除S的栈顶元素,用e返回其值,并返回炽OK;否则返回ERROR
if(s.base==s.top) return ERROR;
e=*--s.top;
return OK;
}
Status StackEmpty(SqStack s)
{if(s.base==s.top) return 1;
else return 0;
}
main()
{char ch1,ch2,c[100];int i;
SqStack s;
InitStack(s);
printf("请输入包括括号表达式:");
scanf("%s",c);
i=0;
while(ch1=c[i++])
{if(ch1=='('||ch1=='{'||ch1=='[')
push(s,ch1);
else if(ch1==')' ||ch1==']' ||ch1=='}')
{ if(StackEmpty(s)) {printf("表达式中的括号不匹配!\n");return ERROR;}
pop(s,ch2);
if(ch2=='(' && ch1!=')') {printf("表达式中的括号不匹配!\n");return ERROR;}
if(ch2=='[' && ch1!=']') {printf("表达式中的括号不匹配!\n");return ERROR;}
if(ch2=='{' && ch1!='}') {printf("表达式中的括号不匹配!\n");return ERROR;}
}
}
if(!StackEmpty(s)) {printf("表达式中的括号不匹配!\n"); return ERROR;}
printf("表达式中的括号匹配!");
printf("\n");
}
5 楼
rickone [专家分:15390] 发布于 2006-03-30 18:44:00
你很高兴啊,很喜欢编程吗?
6 楼
congjuanjuan [专家分:0] 发布于 2006-04-01 23:59:00
如果把if的换成switch会更精简我认为[em3]
7 楼
冷月星光 [专家分:16520] 发布于 2006-04-02 12:27:00
#include <iostream.h>
#include <conio.h>
#include <string.h>
void main()
{
char str[20];
char stack[20];
char* p=stack;
int i=0;
bool Match=true;
cout<<"Input: "<<endl;
cin>>str;
cout<<str<<endl;
for(i=0;i<strlen(str)&&Match;i++)
{
switch(str[i]){
case '(':
case '[':
*p++=str[i];
break;
case ')':
if(*--p!='(')
{
cout<<"Not Match"<<endl;
Match=false;
}
break;
case ']':
if(*--p!='[')
{
cout<<"Not Match"<<endl;
Match=false;
}
break;
default:
cout<<"Input Error!"<<endl;
break;
}
}
if(Match)
cout<<"Match"<<endl;
getche();
}
8 楼
zjkzxy [专家分:310] 发布于 2006-04-06 17:53:00
#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
typedef int Status;
//------栈的顺序存储表示------------
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct
{int *base;
int *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &s)
{//构造一个空栈
s.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
if(!s.base) return ERROR;
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
return OK;
}
Status push(SqStack &s,char e)
{//插入e为新的栈顶元素
if(s.top-s.base>=s.stacksize)
{s.base=(int *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(int));
if(!s.base) return ERROR;
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top++=e;
return OK;
}
Status pop(SqStack &s,char &e)
{//若栈不空,则删除S的栈顶元素,用e返回其值,并返回炽OK;否则返回ERROR
if(s.base==s.top) return ERROR;
e=*--s.top;
return OK;
}
Status StackEmpty(SqStack s)
{if(s.base==s.top) return 1;
else return 0;
}
Status GetTop(SqStack s,char &e)
{//若栈不空,则用e返回s的栈顶元素,并返回OK,否则返回ERROR
if(s.top==s.base) return ERROR;
e=*(s.top-1);
return(e);
}
void matching()
{int state=1;char c,e; SqStack s;
InitStack(s);
printf("请输入包括括号的表达式:");
while(state && (c=getchar())!='\n')
{switch(c)
{case'[':
case'(': push(s,c); break;
case')': if(!StackEmpty(s)&& GetTop(s,e)=='(') pop(s,e);
else state=0; break;
case ']':if(!StackEmpty(s)&& GetTop(s,e)=='[') pop(s,e);
else state=0; break;
}//switch
}//while
if(StackEmpty(s) && state) printf("括号匹配!");
else printf("括号不匹配");
printf("\n");
}
main()
{matching();
}
9 楼
feicun12 [专家分:10] 发布于 2006-12-27 09:22:00
七楼的你到底是想实现什么功能啊?
你那些代码根本就用不了。
单纯是输入了一串字符之后就打出,然后无论输些什么,都显示input error.
我晕
我来回复