数据结构c 栈表应用 括号匹配(请大虾们帮忙改一下错……) 只求在原来基础上改……

#include"stdio.h"
#define STACK_INIT_SIZE 100/*储存空间初始分配量*/
#define STACKINCREMENT 10/*存储空间分配增量*/
#define OK 1
#define OVERFLOW -1
#define ERROR 0
typedef struct{
int *base;
int *top;
int stacksize;
}sqstack;

int initstack(sqstack *s)/*初始化*/
{
s->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
return OK;
}

void pop(sqstack *s)/*出栈*/
{
if(s->top==s->base)
return ERROR;/*若栈为空,则提示出错*/
s->top--;
}

void push(sqstack *s,char e)/*入栈*/
{
if(s->top-s->base>=s->stacksize)/*判断栈是否满*/
{s->base=(int*)realloc(s->base,(s-> stacksize+STACKINCREMENT)*sizeof(int));
if (!s->base)
exit(OVERFLOW);/*存储分配失败*/
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREMENT;
}
*(s->top++)=e;
}

void gettop(sqstack *s,char e)/*取栈顶元素 */
{
if(s->top==s->base)
return ERROR;
e=*(s->top-1);
return e;
}

main()
{
sqstack s;
int i;
char e;
initstack(&s);
clrscr();
char x[10];
for(i=0;i<10;i++)
scanf("%c",&x[i]);
for(i=0;i<10;i++)
{
printf("%c",x[i]);/*向屏幕输出被读出的字符*/
switch(x[i])/*对读到的各种括号分情况处理*/
{
case'{':
case'[':
case'(':
push(&s,x[i]);/*出现以上三种情况则进栈*/
break;
case'}':
gettop(&s,e);
if(e=='{')
pop(&s);/*栈顶的左花括号出栈*/
else return 0;
break;
case']':
gettop(&s,e);
if(e=='[')
pop(&s);/*栈顶的中花括号出栈*/
else return 0;
break;
case')':
gettop(&s,e);
if(e=='(')
pop(&s);/*栈顶的圆花括号出栈*/
else return 0;
break;
}
}

if(s->top==s->base)/*栈最后为空时返回1,否则返回0*/
printf("OK");
else
printf("ERROR");
}
main函数当中
char x[10];
应当先定义在
initstack(&s);
// clrscr();
system("cls") ;之前
其中“// clrscr();”中的
//为手误多打了……抱歉

#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"

#define STACK_INIT_SIZE 100/*储存空间初始分配量*/
#define STACKINCREMENT 10/*存储空间分配增量*/
#define OK 1
#define OVERFLOW -1
#define ERROR 0
typedef struct{
int *base;
int *top;
int stacksize;
}sqstack;

int initstack(sqstack *s)/*初始化*/
{
s->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
return OK;
}

int pop(sqstack *s)/*出栈*/
{
if(s->top==s->base)
return ERROR;/*若栈为空,则提示出错*/
s->top--;
return 1;
}

void push(sqstack *s,char e)/*入栈*/
{
if(s->top-s->base>=s->stacksize)/*判断栈是否满*/
{s->base=(int*)realloc(s->base,(s-> stacksize+STACKINCREMENT)*sizeof(int));
if (!s->base)
exit(OVERFLOW);/*存储分配失败*/
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREMENT;
}
*(s->top++)=e;
}

char gettop(sqstack *s,char e)/*取栈顶元素 */
{
if(s->top==s->base)
return ERROR;
e=*(s->top-1);
return e;
}

main()
{
sqstack s;
int i;
char e;
initstack(&s);
// clrscr();
system("cls") ;
char x[10];
for(i=0;i<10;i++)
scanf("%c",&x[i]);
for(i=0;i<10;i++)
{
printf("%c",x[i]);/*向屏幕输出被读出的字符*/
switch(x[i])/*对读到的各种括号分情况处理*/
{
case'{':
case'[':
case'(':
push(&s,x[i]);/*出现以上三种情况则进栈*/
break;
case'}':
gettop(&s,e);
if(e=='{')
pop(&s);/*栈顶的左花括号出栈*/
else return 0;
break;
case']':
gettop(&s,e);
if(e=='[')
pop(&s);/*栈顶的中花括号出栈*/
else return 0;
break;
case')':
gettop(&s,e);
if(e=='(')
pop(&s);/*栈顶的圆花括号出栈*/
else return 0;
break;
}
}

if(s.top==s.base)/*栈最后为空时返回1,否则返回0*/
printf("OK");
else
printf("ERROR");
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-11-10
缺少头文件
stdlib.h
gettop的参数应该传入e的地址这样才能返回值给e,否则e没有初始化。
一般用bool形式(true false)来表示成功与否。
主函数里,应该是s.base这些,结构体是用“.”,结构体指针才是“->”.
以下为代码:
#include"stdio.h"
#include"stdlib.h"
#define STACK_INIT_SIZE 100/*储存空间初始分配量*/
#define STACKINCREMENT 10/*存储空间分配增量*/
#define OK 1
#define OVERFLOW -1
#define ERROR 0
typedef struct{
int *base;
int *top;
int stacksize;
}sqstack;

int initstack(sqstack *s)/*初始化*/
{
s->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
return OK;
}

bool pop(sqstack *s)/*出栈*/
{
if(s->top==s->base)
return false;/*若栈为空,则提示出错*/
s->top--;
return true;
}

void push(sqstack *s,char e)/*入栈*/
{
if(s->top-s->base>=s->stacksize)/*判断栈是否满*/
{s->base=(int*)realloc(s->base,(s-> stacksize+STACKINCREMENT)*sizeof(int));
if (!s->base)
exit(OVERFLOW);/*存储分配失败*/
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREMENT;
}
*(s->top++)=e;
}

bool gettop(sqstack *s,char *e)/*取栈顶元素 */
{
if(s->top==s->base)
return false;
*e=*(s->top-1);
return true;
}

int main()
{
sqstack s;
int i;
char e;
initstack(&s);
system("cls");
char x[10];
for(i=0;i<10;i++)
scanf("%c",&x[i]);
for(i=0;i<10;i++)
{
printf("%c",x[i]);/*向屏幕输出被读出的字符*/
switch(x[i])/*对读到的各种括号分情况处理*/
{
case'{':
case'[':
case'(':
push(&s,x[i]);/*出现以上三种情况则进栈*/
break;
case'}':
gettop(&s,&e);
if(e=='{')
pop(&s);/*栈顶的左花括号出栈*/
else return 0;
break;
case']':
gettop(&s,&e);
if(e=='[')
pop(&s);/*栈顶的中花括号出栈*/
else return 0;
break;
case')':
gettop(&s,&e);
if(e=='(')
pop(&s);/*栈顶的圆花括号出栈*/
else return 0;
break;
}
}
if(s.top==s.base)/*栈最后为空时返回1,否则返回0*/
printf("\nOK");
else
printf("\nERROR");
}
第2个回答  2012-09-13
太复杂了!
while((ch=getchar())!='\n')
{ switch(ch)
{ case '(': ch = 1; break;
case ')': ch = -1; break;
case '[': ch = 2; break;
case ']': ch = -2; break;}
if( ch + S.data[S.top] == 0 && ch < S.data[S.top] ) PopStack(&S);
else PushStack (&S, ch);
}
if(S.top == 0) printf("YES");
else printf("NO");
相似回答