求救!!!!四则运算的问题

appleyy 2005-11-03 11:06:17
用C
四则运算要考虑加减乘除的优先级,带括号运算,以‘=’结束
要求是用堆栈法
例:(2+3)*4-6/2=17
急!!!!!!
...全文
208 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
daylove 2005-11-08
  • 打赏
  • 举报
回复
直接求代码不好,看数据结构书和编译原理书,都有讲的
yuanchuang 2005-11-06
  • 打赏
  • 举报
回复
学习,不是benlei999(醉明月)提到严魏敏老师那本《数据结构》,我都忘了这本书了,想想现在也应该上灰了,呵呵,要拿出来看一遍了,数据结构可是基础啊。
bombwang 2005-11-06
  • 打赏
  • 举报
回复
学习
appleyy 2005-11-05
  • 打赏
  • 举报
回复
求完整的代码!!!!
qhfu 2005-11-03
  • 打赏
  • 举报
回复
#include<stack>
#include<string>
#include<iostream>
#include<cctype>

using std::stack;
using std::string;
using std::cout;
using std::cin;

struct pri{
int sp; //stack priority
int xp; //expression priority
};

void get_priority(char ch,pri &p)
{
switch(ch)
{
case '+' :
case '-' :
p.sp = 1;
p.xp = 1;
break;
case '*' :
case '/' :
p.sp = 2;
p.xp = 2;
break;
case '(' :
p.sp = 0;
p.xp = 3;
break;
case ')' :
p.sp = -1;
p.xp = -1;
break;
case '#' :
p.sp = 0;
p.xp = 0;
}
}

int& do_operator(int n1,int n2,char op,int &ret)
{
switch(op)
{
case '+':
ret = n1+n2;
break;
case '-':
ret = n2-n1;
break;
case '*':
ret = n1 * n2;
break;
case '/':
ret = n2/n1;
break;
}
return ret;
}

int process()
{
int value;
stack<int> s1;
stack<char> s2;
s2.push('#');
char ch;
while(cin>>ch)
{
if(ch ==';')
break;
pri p1,p2;
if(isdigit(ch))
s1.push(ch-48);
else
{
get_priority(ch,p1);
char op = s2.top();
get_priority(op,p2);
if(p1.xp>p2.sp)
s2.push(ch);
else
{
while(s2.top()!='#'&&p1.xp<=p2.sp)
{
int num1,num2,num;
if(!s1.empty())
{
num1 = s1.top();
s1.pop();
}
else
{
cout<<"the expression is worry!";
exit(-1);
}
if(!s1.empty())
{
num2 = s1.top();
s1.pop();
}
else
{
cout<<"the expression is worry!";
exit(-1);
}

do_operator(num1,num2,op,num);
s1.push(num);
s2.pop();
if(s2.top() == '('&&ch ==')')
{
s2.pop();
cin>>ch;
get_priority(ch,p1);

}
op = s2.top();
get_priority(op,p2);
}
s2.push(ch);
}
}
}
value = s1.top();
return value;
}

int main()
{
int val = process();
cout<<val;
system("pause");
}
但是表达书的写法是:(2+3)*4-6/2#;后面要加#和;忘了为什么当时要这样做了。
benlei999 2005-11-03
  • 打赏
  • 举报
回复
曾经做过一个,建议自己做,在严魏敏老师那本《数据结构》书里已经把算法讲得很详细了
snowbirdfly 2005-11-03
  • 打赏
  • 举报
回复
哦~~
不好意思~
看错了~~
应该是'stack.h'为自己定义的头文件,不是系统头文件~~~
在书上应该有介绍~
你自己必须把头文件加入进去~这样就没有问题了~~
snowbirdfly 2005-11-03
  • 打赏
  • 举报
回复
当然有错误了`~
因为'stack.h'是自己写的头文件~
又不是系统里面的头文件~~~
可能是qhfu(崩溃) ( ) 信誉:105 忘记没有帖全~~~
呵呵,发个短信问他要啊~~~
appleyy 2005-11-03
  • 打赏
  • 举报
回复
#include<string.h>
#include<stdio.h>
#include<malloc.h>
#include<conio.h>

#define EOFILE '`'

typedef char SElemType;

#include "stack.h"

Status visit(SElemType * e)
{
printf("%c", *e);
}

char OP[10]={'+','-','*','/','(',')','#'};
int precede[7][7]={
1,1,2,2,2,1,1,
1,1,2,2,2,1,1,
1,1,1,1,2,1,1,
1,1,1,1,2,1,1,
2,2,2,2,2,3,0,
1,1,1,1,0,1,1,
2,2,2,2,2,0,3};

int In(char c,char *op)
{
int i=0;
while(i<7)
if(c==op[i++])
return 1;
return 0;
}

char Precede(char op,char c)
{
int pos_op;
int pos_c;
int i;
for(i=0;i<7;i++)
{
if(op==OP[i]) pos_op=i;
if(c==OP[i]) pos_c=i;
}
switch(precede[pos_op][pos_c])
{
case 1: return '>';
case 2: return '<';
case 3: return '=';
}
}

char Operate(int a,char theta,int b)
{
switch(theta)
{
case '+':return a+b-'0';
case '-':return a-b+'0';
case '*':return (a-'0')*(b-'0')+'0';
case '/':return (a-'0')/(b-'0')+'0';
}
}

char EvaluateExpression()
{
SqStack *OPND,*OPTR;
char c,x,theta;
char a,b;
InitStack(&OPTR); Push(OPTR,'#');
InitStack(&OPND);
c=getchar();
while(c!='#'||GetTop(*OPTR)!='#')
{
if(!In(c,OP))
{Push(OPND,c);c=getchar();}
else
switch(Precede(GetTop(*OPTR),c))
{
case '<':
Push(OPTR,c);
c=getchar();
break;
case '=':
Pop(OPTR,&x);
c=getchar();
break;
case '>':
Pop(OPTR,&theta);
Pop(OPND,&b); Pop(OPND,&a);
Push(OPND,Operate(a,theta,b));
break;
}
}
c=GetTop(*OPND);
DestroyStack(OPTR);
DestroyStack(OPND);
return c;
}


main()
{
char i;
printf("\n\n\n\nOnly within 0..9 evaluation,input a expression end with symbol #:\n");
i=EvaluateExpression();
printf("\nThis expression's result is: ");
printf("%d\n\n\n\n",i-'0');
printf("\n\nWelcome to visit http://zmofun.yeah.net !");
}

这是严那个的,但我运行的时候提示C:\Program Files\Microsoft Visual Studio\MyProjects\111111111\11111111.cpp(5) : fatal error C1083: Cannot open include file: 'stack.h': No such file or directory
这是为什么呢
qhfu 2005-11-03
  • 打赏
  • 举报
回复
o , 没看清楚,我c的代码没有,上面那个可以算出结果,不过要(2+3)*4-6/2#;格式比较奇怪。
appleyy 2005-11-03
  • 打赏
  • 举报
回复
上面的代码算不出结果啊
而且要求是C
code8238 2005-11-03
  • 打赏
  • 举报
回复
两个栈,一个放符号,一个放数值

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧