| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 858 人关注过本帖
标题:[求助]用栈进行表达式的计算
只看楼主 加入收藏
ala2345
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-4-10
收藏
 问题点数:0 回复次数:1 
[求助]用栈进行表达式的计算

这是用栈来进行表达式求解的,比如输入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;
}

}

搜索更多相关主题的帖子: 表达 
2006-04-10 01:01
stnlcd
Rank: 1
等 级:新手上路
帖 子:177
专家分:1
注 册:2004-11-21
收藏
得分:0 

给楼主这样一个建议:将判断两个操作数优先级的函数Precede改为用二维数组来实现.比如先行符号c表示数组的行,+,-,*,/,(,),#依次为数组行的0,1,2,3,4,5,6号下标,后跟符号cc表示数组的,,+,-,*,/,(,),#依次为数组列的0,1,2,3,4,5,6号下标。比如+号后跟*号,肯定是*号优先级大,可以表示为Precede[0][2]=-1(其中0表示+,2表示*,-1表示<)此时应该入栈,否则如果*号后跟+号就是Precede[2][0]=1,表示需要出栈进行归约计算,这样可以大大降低程序代码量,而且不容易出错。
为了编写实用的表达式计算程序,程序当然容许输入空格子类的东西,应该先有词法分析在前面为好。

[此贴子已经被作者于2006-4-10 9:11:47编辑过]


要让一个男人破产,请给他一架相机,要让一个男人倾家荡产,请给他一架望远镜。
2006-04-10 09:09
快速回复:[求助]用栈进行表达式的计算
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034379 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved