请教有关表达式求值的问题
我学习数据结构时,试着实现表达式求值,只要求能够简单计算10以下的数(包括算式结果),包括几种基本四则运算和括号,且表达式开始和末尾以‘#’标识。但是总是有问题,想请教各位帮忙看一下源代码有什么问题,我不怎么会写程序,望各位批评指正!!谢谢
我是在vc编译器下运行的,但是重视出现三行“the stack is empty!”
#include <stdio.h>
#include <stdlib.h>
#define STACKSIZEINIT 100
char Table[7][7]=
{
{ '> ', '> ', ' < ', ' < ', ' < ', '> ', '> '},
{ '> ', '> ', ' < ', ' < ', ' < ', '> ', '> '},
{ '> ', '> ', '> ', '> ', ' < ', '> ', '> '},
{ '> ', '> ', '> ', '> ', ' < ', '> ', '> '},
{ ' < ', ' < ', ' < ', ' < ', ' < ', '= ',0},
{ '> ', '> ', '> ', '> ',0, '> ', '> '},
{ ' < ', ' < ', ' < ', ' < ', ' < ',0, '= '},
};//运算符优先级表
struct Stack
{
char *base;
char *top;
int Stacksize;
};
void InitStack(Stack &s)
{
s.base=(char *)malloc(STACKSIZEINIT * sizeof(char));
if(!s.base)
{
printf( "Allocation failed!\n ");
return;
}
s.top=s.base;
s.Stacksize=STACKSIZEINIT;
}
void push(Stack &s,char c)
{
if(s.top> =s.base+STACKSIZEINIT)
printf( "over flow\n ");
else
{
*s.top=c;
s.top++;
}
}
void pop(Stack &s,char &c)
{
if(s.top=s.base)
printf( "the stack is empty!\n ");
else
c=*(--s.top);
}
char gettop(Stack &s)
{
return *(s.top-1) ;
}
bool IsNumber(char c)
{
if(c> = '0 '&&c <= '9 ')
return true;
else
return false;
}//判断字符是否是数字
char Operate(char a,char theta,char b)
{
int a1=a-48;
int b1=b-48;
switch(theta)
{
case '+ ':
return 48+(a1+b1);
break;
case '- ':
return 48+(a1-b1);
break;
case '* ':
return 48+a1*b1;
break;
case '/ ':
return 48+a1/b1;
break;
default:
return 0;
}
}//返回运算操作结果
int getorder(char a)
{
switch(a)
{
case '+ ':
return 0;
break;
case '- ':
return 1;
break;
case '* ':
return 2;
break;
case '/ ':
return 3;
break;
case '( ':
return 4;
break;
case ') ':
return 5;
break;
case '# ':
return 6;
break;
}
} //根据运算符求的其在table表中的下标
char Precede(char a,char b)
{
return Table[getorder(a)][getorder(b)];
}//返回优先级
char calc()
{
Stack op,number;//op为操作符栈,number为操作数栈
char c=NULL;
char theta=NULL;
char a=NULL;
char b=NULL;
char x;
InitStack(op); push(op, '# ');
InitStack(number);
printf( "Please input the math problem:\n ");
c=getchar();
while(c!= '# '||gettop(op)!= '# ')
{
if(IsNumber(c)) { push(number,c);c=getchar();}//若字符是数字这入数值number栈
else
switch(Precede(gettop(op),c))//否则如操作符栈
{
case ' < ' :
push(op,c); c=getchar();
break;
case '= ' :
pop(op,x); c=getchar();
break;
case '> ' :
pop(op,theta);
pop(number,b);pop(number,a);
push(number,Operate(a,theta,b));
break;
}
}
int result=gettop(number)-48;
delete op.base;
delete number.base;
return result;
}
void main()
{
printf( "the result is %d\n ",calc());
return;
//getch();
}
[解决办法]
s.base=(char *)malloc(STACKSIZEINIT * sizeof(char));
delete op.base;
delete number.base;
/////////////////////
你这在干啥呀
[解决办法]
malloc 对应 free
new 对应 delete
不要搞混了