【栈求表达式的值】求助!调试能发现问题出处,但是自己却看不出哪里问题更不知到怎么改
有道题是利用栈求算术四则运算表达式,我写了一个代码,但是结果不对,请高手指点!我调试的时候用的是:12+1#<CR>,先不管更多运算符,只求这个最简单的表达式求值正确,
调试时可以看到Pop函数没有正确的取到数字,但是自己实在没找到问题在哪,拜托了!
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define INIT_SIZE 50
#define INCREMENT 10
//定义栈
typedef struct
{
int *base;
int *top;
int stacksize;
}MyStack;
void InitStack(MyStack *s)
{
s->base=(int *)malloc(INIT_SIZE*sizeof(int));
if(!s->base) exit(-1);
s->top=s->base;
s->stacksize=INIT_SIZE;
}
//获取栈顶元素
char GetTop(MyStack *s)
{
if(s->base==s->top)
{
printf("当前栈中无任何元素!\n");
return -1;
}
return *(s->top-1);
}
//进栈操作
void Push(MyStack *s,int e)
{
if((s->top-s->base)>=s->stacksize)
s->base=(int *)realloc(s->base,(s->stacksize+INCREMENT)*sizeof(int));
if(!s->base) exit(-1);
*s->top=e;
s->top++;
}
//出栈操作
void Pop(MyStack *s,int et)
{
if(s->top==s->base)
{
printf("当前栈中无任何元素!\n");
return;
}
s->top--;
et =*s->top;
}
//判断运算符的优先级
char compare(MyStack *s,char sen)
{
char fir=GetTop(s);
if(sen=='#')
{
if(fir=='#')
return '=';
else
return '<';
}
if(sen=='(')
return '<';
if(sen==')')
{
if(fir=='(')
return '=';
else
return '>';
}
if(sen=='+'||sen=='-')
{
if(fir=='('||fir=='#')
return '>';
else
return '<';
}
if(sen=='*'||sen=='/')
if(fir=='*'||fir=='/'||fir==')')
return '<';
else
return '>';
else return -1;
}
//根据符号计算a与b
int getresult(int a,char opc,int b)
{
switch(opc)
{
case '+':return a+b;
case '-':return a-b;
case '*':return a*b;
case '/':return a/b;
}
return -1;
}
int main()
{
//num临时变量,将输入的字符数字转换成数字
//numa,numb要计算的两个数的
//op操作符
int num=0,numa=0,numb=0,op=0;
//定义运算数栈和运算符栈
MyStack snum,schar;
InitStack(&snum);
InitStack(&schar);
Push(&schar,'#');
printf("请输入算术运算表达式:\n");
char inchar;
inchar=getchar();
while(inchar!='#'||GetTop(&schar)!='#')
{
//判断是否位数字,是的话则连续取数字字符并转换为整形
if(isdigit(inchar))
{
num=inchar-'1'+1;
inchar=getchar();
while(isdigit(inchar))
{
num=num*10+(inchar-'1'+1);
inchar=getchar();
}
printf("%d\n",num);
Push(&snum,num);
}
//是运算符的情况
switch(compare(&schar,inchar))
{
case '>':Push(&schar,inchar);inchar=getchar();break;
case '=':Pop(&schar,inchar);inchar=getchar();break;
case '<':
Pop(&schar,op);
Pop(&snum,numb);
Pop(&snum,numa);
Push(&snum,getresult(numa,(char)op,numb));break;
default:printf("输入错误!\n");return -1;
}
}
Pop(&snum,num);
printf("%d",num);
getchar();
return 0;
}