这是用栈来进行表达式求解的,比如输入3*(7-2)# ,就可得到结果
可是我的总是出现编译不报错,但运行结果不对的情况,我尝试对它进行编译,可是也不知是哪里错的,
希望各位大侠能帮我看一下。
谢谢
#include<stdio.h>
#include<iostream.h>
#include<malloc.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct{
char *base;
char *top;
int stacksize;
}Sqstack;
typedef struct{
int *base;
int *top;
int stacksize;
}Sqstack_ND;
typedef int Status;
Status Initstack(Sqstack &S){
S.base=(char *)malloc(STACK_INIT_SIZE * sizeof( char));
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
Status Initstack(Sqstack_ND &S){
S.base=(int *)malloc(STACK_INIT_SIZE * sizeof( int));
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
Status Destroystack(Sqstack &S){
free( S.base);
free( S.top );
return OK;
}
Status Destroystack(Sqstack_ND &S){
free( S.base);
free( S.top );
return OK;
}
Status Clearstack(Sqstack &S){
S.top=S.base ;
return OK;
}
Status Clearstack(Sqstack_ND &S){
S.top=S.base ;
return OK;
}
Status Stackempty(Sqstack &S){
if(S.top =S.base ) return TRUE;
else return FALSE;
}
Status Stackempty(Sqstack_ND &S){
if(S.top =S.base ) return TRUE;
else return FALSE;
}
int Stacklength(Sqstack &S){
int sum=0;
if(S.top ==S.base ) return ERROR;
sum=S.top -S.base;
return sum;
}
int Stacklength(Sqstack_ND &S){
int sum=0;
if(S.top ==S.base ) return ERROR;
sum=S.top -S.base;
return sum;
}
Status Gettop(Sqstack &S, char &e){
if(S.top ==S.base ) return ERROR;
e=*(S.top -1);
return OK;
}
Status Gettop(Sqstack_ND &S, int &e){
if(S.top ==S.base ) return ERROR;
e=*(S.top -1);
return OK;
}
Status Push(Sqstack &S, char &e){
if(S.top -S.base >=S.stacksize ){
S.base =(char *)realloc(S.base ,(S.stacksize +STACKINCREMENT)*sizeof(char));
if(!S.base ) exit(OVERFLOW);
S.top =S.base +S.stacksize ;
S.stacksize +=STACKINCREMENT;
}
*S.top ++=e;
return OK;
}
Status Push(Sqstack_ND &S, int &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;
return OK;
}
Status Pop(Sqstack &S,char &e){
if(S.top ==S.base ) return ERROR;
e=*--S.top ;
return OK;
}
Status Pop(Sqstack_ND &S,int &e){
if(S.top ==S.base ) return ERROR;
e=*--S.top ;
return OK;
}
Status In(char c){
if(c!='+')
if(c!='-')
if(c!='*')
if(c!='/')
if(c!='(')
if(c!=')')
if(c!='#')
return 1;
else return 0;
}
Status Operate(int a, char theta, int b){
if(theta=='+')
return (a+b) ;
else if (theta=='-')
return (a-b) ;
else if (theta=='*')
return (a*b) ;
else if (theta =='/')
return (a/b) ;
}
char Precede(char c, char cc){
if(c=='+'){
if(cc!='*' && cc!='/' && cc!='(')
return '>';
else return '<';
}
else if(c=='-'){
if(cc!='*' && cc!='/' && cc!='(')
return '>';
else return '<';
}
else if(c=='*'){
if(cc!='(')
return '>';
else return '<';
}
else if(c=='/'){
if(cc!='(')
return '>';
else return '<';
}
else if(c=='('){
if(cc==')')
return '=';
else if(cc=='#')
exit(0);
else return '<';
}
else if(c==')'){
if(cc=='(')
exit(0);
else return '>';
}
else{
if(cc==')')
exit(0);
else if(cc=='#')
return '=';
else return '<';
}
}
int Evaluateexpression(){
char c=' ', cc=' ', ccc=' ',x=' ',y=' ';
char theta=' ';
int a, b ,cn,cm,cp;
Sqstack OPTR;
Sqstack_ND OPND;
Initstack(OPND);
Initstack ( OPTR );
Push(OPTR , x='#');
c=getchar();
Gettop(OPTR, cc);
while( c!='#'|| cc!='#'){
if(In(c)){
cn= c-'0';
Push(OPND, cn);
// c=getchar();
cin>>c;
}
else{
Gettop(OPTR, cc);
switch(Precede(c, cc)){
case '<':
Push(OPTR, c);
c=getchar();
break;
case '=':
Pop(OPTR, y);
c=getchar();
break;
case '>':
Pop(OPTR, theta);
Pop(OPND, b);
Pop(OPND, a);
cm=Operate(a, theta, b);
Push(OPND, cm);
break;
}
}
}
Gettop(OPND, cp);
return cp;
}
void main(){
char x='g';
cout<<"注意:输入表达试时尽量不要用空格,这样程序可能会对你的输入不加理睬!"<<endl;
cout<<"注意表达试以#号键结束"<<endl;
while(x!='n'){
cout<<"输入表达试"<<endl;
cout<<Evaluateexpression()<<endl;
cout<<"输入g继续,输入n将退出程序"<<endl;
cin>>x;
}
}