首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

请进来看看这个栈的有关问题

2012-02-06 
请进来看看这个栈的问题程序目的是求表达式的值如:1+(20+4)/(4-1)得:9#includeiostream.h#includestdio

请进来看看这个栈的问题
程序目的是求表达式的值   如:1+(20+4)/(4-1)   得   :9

#include   <iostream.h>
#include   <stdio.h>
#include   <stdlib.h>
#include   <malloc.h>

#define   STACK_INIT_SIZE   10
#define   STACKINCREMENT10

#define   ERROR0
#define   OK1

struct   SqStack
{
char   *base;
char   *top;
int   stacksize;
};

SqStack   InitStack(SqStack   stack)//初始化
{
stack.base   =   (char   *)malloc(STACK_INIT_SIZE   *   sizeof(char));
stack.top   =   stack.base;
stack.stacksize   =   STACK_INIT_SIZE;
return   stack;
}

SqStack   Push(SqStack   stack,char   elem)//入栈
{
if(stack.top   -   stack.base   > =   stack.stacksize)         //空间不足再分配空间
{
stack.base   =   (char   *)realloc(stack.base,(stack.stacksize   +   STACKINCREMENT)   *   sizeof(char));
stack.top   =   stack.base   +   stack.stacksize;
stack.stacksize   +=   STACKINCREMENT;
}
*stack.top++   =   elem;
return   stack;
}

SqStack   Pop(SqStack   stack)//出栈
{
stack.top--;
return   stack;
}

char   GetTop(SqStack   stack)//返回栈顶元素
{
char   elem;
if(stack.top   ==   stack.base)
return   ERROR;
elem   =   *(stack.top   -   1);
return   elem;
}

int   IsOperate(char   elem)//判断改elem是否为操作符
{
if(elem   ==   '+ '||elem   ==   '- '||elem   ==   '* '||elem   ==   '/ '||elem   ==   '( '||elem   ==   ') ')
return   OK;
else
return   ERROR;
}

char   Precede(char   elem1,char   elem2)//运算符优先级函数
{
if(elem1   ==   '( '   &&   elem2   ==   ') ')
return   '= ';
if(elem1   ==   '( '   ||   elem2   ==   '( ')
return   ' < ';
if(   (elem1   ==   '+ '   ||   elem1   == '- ')   &&   (elem2   ==   '* '   ||   elem2   ==   '/ ')   )
return   ' < ';
else
return   '> ';
}

int   Operate(int   a,char   opte,int   b)//表达式运算函数
{
if(b   ==   0)
return   ERROR;
else
switch(opte)
{
case   '+ ':
return   a+b;
case   '- ':
return   a-b;
case   '* ':
return   a*b;
case   '/ ':
return   a/b;
default:
return   ERROR;
}
}

void   main()//主函数
{
SqStack   Num_stack,Oper_stack;//定义两个栈   运算数栈和运算符栈
char   Elem;
char   opte;
int   num1,num2,result;

Num_stack.base   =   NULL;
Num_stack.top   =   NULL;
Num_stack.stacksize   =   0;

Oper_stack.base   =   NULL;
Oper_stack.top   =   NULL;
Oper_stack.stacksize   =   0;

Num_stack   =   InitStack(Num_stack);//初始化栈  


Oper_stack   =   InitStack(Oper_stack);

Elem   =   getchar();
while(Elem   !=   '\n ')//回车结束
{
if(!IsOperate(Elem))//如不是运算符则入运算数栈
{
Num_stack   =   Push(Num_stack,Elem);
Elem   =   getchar();
}
else
switch(Precede(GetTop(Oper_stack),Elem))//判断栈顶元素与接受元素的优先级
{
case   ' < ':
Oper_stack   =   Push(Oper_stack,Elem);//若小则接着入栈
Elem   =   getchar();
break;
case   '= '://相等则出栈     脱括号
Oper_stack   =   Pop(Oper_stack);
Elem   =   getchar();
break;
case   '> '://大于则进行运算
opte   =   GetTop(Oper_stack);//运算符出栈
Oper_stack   =   Pop(Oper_stack);

num2   =   atoi(Num_stack.top   -   1);//运算数出栈并转化为整形
Num_stack   =   Pop(Num_stack);

num1   =   atoi(Num_stack.top   -   1);
Num_stack   =   Pop(Num_stack);

Num_stack   =   Push(Num_stack,(char)Operate(num1,opte,num2));//结果入栈
break;
}
}
result   =   (int)GetTop(Num_stack);//得到整个表达式结果
cout < < "the   result   is   : " < <result < <endl;
}


运行时中断
找了好久不知道错在哪!

[解决办法]
case '> ':这个条件在break前应该继续向下读取数字:

case '> ':
//
//
Elem = getchar();
break;

否则死循环中断.
[解决办法]
你这个代码问题太多
1、switch(Precede(GetTop(Oper_stack),Elem))
第一个操作符跟谁判断?而 GetTop 返回 ERROR 后,Precede函数没有处理这个错误,后面就不用看了,一错全错

2、你把所有的操作数全部转为字符“入栈”,却没有记录它们的长度,“出栈”的时候你出几个字符组成一个操作数?也就是说,假如我输入 123+456的话,你“出栈”的两个操作数是 "6 " 和 "56 ",atoi 后就变成了 num1 == 56,num2 == 6 (为什么是 56 见下)

3、你既然在“栈”中是以字符方式保存的操作数,就应该在“出栈”的时候把当前取出的字符所占用的“栈空间”释放(置零)

貌似还有其他逻辑上的问题。。。我看得眼都晕了

建议你先做出流程图,看到流程没有问题了,再写代码。。。这个代码貌似还是有点难度的

热点排行