请进来看看这个栈的问题
程序目的是求表达式的值 如: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、你既然在“栈”中是以字符方式保存的操作数,就应该在“出栈”的时候把当前取出的字符所占用的“栈空间”释放(置零)
貌似还有其他逻辑上的问题。。。我看得眼都晕了
建议你先做出流程图,看到流程没有问题了,再写代码。。。这个代码貌似还是有点难度的