表达式求值,第一次做,不知道问题出在那
本帖最后由 努力学习只是 于 2017-10-9 21:01 编辑表达式求值,设置了两个栈,一个存运算符,一个存数字;
输入153 * 12 + 1,结果输不出;代码较长,能不能帮我,看看问题所在,谢谢了
#include"iostream"
#include"stdio.h"
#include"stdlib.h"
#include"ctype.h"
using namespace std;
#define sizestack 50
typedef double elemtype;
typedef char elemtype_1;
typedef char status;
typedef struct stacklink{//存数字栈
elemtype * base;
elemtype * top;
int stacksize;
}link;
typedef struct stacklink_1{//存运算符栈
elemtype_1 * base;
elemtype_1 * top;
int stacksize;
}clink;
void initstack(link &s){
s.base=(elemtype*)malloc(sizestack*sizeof(elemtype));
s.top=s.base;
s.stacksize=sizestack;
}
void initstack_1(clink &s){
s.base=(elemtype_1*)malloc(sizestack*sizeof(elemtype_1));
s.top=s.base;
s.stacksize=sizestack;
}
void push(link &s,double c){//压入数字
*s.top=c;
++s.top;
}
void push_1(clink &s,char c){//压入运算符
*s.top=c;
++s.top;
}
int pop(link& s,double &e){
--s.top;
e=*s.top;
return 1;
}
int pop_1(clink& s,char &e){//弹出运算符
--s.top;
e=*s.top;
return 1;
}
double gettop(link s){
--s.top;
return *s.top;
}
char gettop_1(clink s){//取栈顶元素
--s.top;
return *s.top;
}
char precede(char q,char p){//判断运算的优先级,q 是栈顶元素, p是入栈的运算符
char z;
if(q=='#')
switch(p){
case'#':z='=';break;
case')':break;
default:z='<';break;
}
if(q=='+'||q=='-')
switch(p){
case'+':z='>';break;
case'-':z='>';break;
case'*':z='<';break;
case'/':z='<';break;
case'(':z='<';break;
case')':z='>';break;
case'#':z='>';break;
}
if(q=='*'||q=='/')
switch(p){
case'+':z='>';break;
case'-':z='>';break;
case'*':z='>';break;
case'/':z='>';break;
case'(':z='<';break;
case')':z='>';break;
case'#':z='>';break;
}
if(q=='(')
switch(p){
case')':z='>';break;
case'#':exit(0);break;
default:z='<';break;
}
if(q==')')
switch(p){
case'(':exit(0);break;
default:z='>';break;
}
return z;
}
double operate(double a,char theta, double b){
if(theta=='-')return b-a;
if(theta=='*')return b*a;
if(theta=='/')return b/a;
if(theta=='+')return b+a;
}
doubleoperatype(){
double a,b,d;
clink optr; //字符栈
link opnd;//数字栈
initstack_1(optr);//初始化
push_1(optr,'#');
initstack(opnd);//初始化
char c,theta,x,s;
char str;
int i=0;
scanf("%c",&c);
while(c!='#'||gettop_1(optr)!='#'){
while(isdigit(c)||c=='.'){//将输入的数有字符型转为双精度型
str=c;
++i;
str='\0';
if(i>=10)return -1;
scanf("%c",&c);
if(c==' '){
d=atof(str);
push(opnd,d);
i=0;
break;
}
}
scanf("%c",&c);
if(c=='*'||c=='/'||c=='-'||c=='+'||c=='#'){
switch(precede(gettop_1(optr),c)){ //判断输入运算符和运算符栈顶的元素 优先级
case'<':
cout<<'<';
push_1(optr,c);
break;
case'=':
cout<<'=';
pop_1(optr,x);
break;
case'>':
cout<<'>';
pop_1(optr,theta);
pop(opnd,a);
pop(opnd,b);
push(opnd,operate(a,theta,b));
break;
}
}
}
return gettop(opnd);
}
int main(){
cout<<operatype();//输出计算的结果
return 0;
} 这是重新又打的代码,问题已经解决了,有兴趣可以来看看,这个程序的 cin 和 scanf 很关键,不能随便改,本人也不是清楚他们的区别。另外检测输入的函数,还没有打出来,可以来提点意见。
#include"iostream"
#include"stdio.h"
#include"stdlib.h"
#include"ctype.h"
using namespace std;
#define sizestack 50
typedef double elemtype;
typedef char elemtype_1;
typedef char status;
typedef struct stacklink{
elemtype * base;
elemtype * top;
int stacksize;
}link;
typedef struct stacklink_1{
elemtype_1 * base;
elemtype_1 * top;
int stacksize;
}clink;
void initstack(link &s){
s.base=(elemtype*)malloc(sizestack*sizeof(elemtype));
s.top=s.base;
s.stacksize=sizestack;
}
void initstack_1(clink &s){
s.base=(elemtype_1*)malloc(sizestack*sizeof(elemtype_1));
s.top=s.base;
s.stacksize=sizestack;
}
void push(link &s,double c){
*s.top=c;
++s.top;
}
void push_1(clink &s,char c){
*s.top=c;
++s.top;
}
int pop(link& s,double &e){
--s.top;
e=*s.top;
return 1;
}
int pop_1(clink& s,char &e){
--s.top;
e=*s.top;
return 1;
}
double gettop(link s){
--s.top;
return *s.top;
}
char gettop_1(clink s){
--s.top;
return *s.top;
}
char precede(char q,char p){
char z;
if(q=='#')
switch(p){
case'#':z='=';break;
case')':break;
default:z='<';break;
}
if(q=='+'||q=='-')
switch(p){
case'+':z='>';break;
case'-':z='>';break;
case'*':z='<';break;
case'/':z='<';break;
case'(':z='<';break;
case')':z='>';break;
case'#':z='>';break;
}
if(q=='*'||q=='/')
switch(p){
case'+':z='>';break;
case'-':z='>';break;
case'*':z='>';break;
case'/':z='>';break;
case'(':z='<';break;
case')':z='>';break;
case'#':z='>';break;
}
if(q=='(')
switch(p){
case')':z='=';break;
case'#':exit(0);break;
default:z='<';break;
}
if(q==')')
switch(p){
case'(':exit(0);break;
default:z='>';break;
}
return z;
}
double operate(double a,char theta, double b){
if(theta=='-')return b-a;
if(theta=='*')return b*a;
if(theta=='/')return b/a;
if(theta=='+')return b+a;
}
int in(char c){
switch(c){
case'/':return 1;break;
case'+':return 1;break;
case'-':return 1;break;
case'*':return 1;break;
default :return 0;break;
}
}
doubleoperatype(){
double a,b,d,n;
clink optr; link opnd;
initstack_1(optr);
push_1(optr,'#');
initstack(opnd);
char c,theta,x,s;
char str;
int i=0;
cin>>c;
while(c!='#'||gettop_1(optr)!='#'){
if(isdigit(c)||c=='.'){
str=c;
++i;
str='\0';
if(i>=10)return -1;
scanf("%c",&c);
if(c==' '){
d=atof(str);
push(opnd,d);
i=0;
scanf("%c",&c);
}
}
/* if(!in(c)){
scanf("%lf",&n);
push(opnd,n);
scanf("%c",&c);
cout<<c;
}*/
else{
if(precede(gettop_1(optr),c)=='<'){
cout<<'<';
push_1(optr,c);
cin>>c;
}else
if(precede(gettop_1(optr),c)=='='){
cout<<'=';
pop_1(optr,x);
cin>>c;
}
else
if(precede(gettop_1(optr),c)=='>'){
cout<<'>';
pop_1(optr,theta);
pop(opnd,a);
pop(opnd,b);
push(opnd,operate(a,theta,b));
}
}
}
return gettop(opnd);
}
int main(){
cout<<operatype();
return 0;
}
页:
[1]