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

#include "iostream.h" #include "stdio.h" #define MAX 20 typedef struct //定义操作数的栈 { int data[MAX]; int top; }AB;

typedef struct //定义操作符的栈 { char ch[MAX]; int top; }CD;

AB* InitStack1(); CD* InitStack2(); int Empty1(AB *r); int Empty2(CD *s); void Push1(AB *r,int a); void Push2(CD *s,char b); int Full1(AB *r); int Full2(CD *s); void Pop1(AB *r,int m); //出栈并返回栈顶元素m void Pop2(CD *s,char n); //出栈并返回栈顶元素n int GetTop1(AB *r); char GetTop2(CD *s); int precede(char c1,char c2); //比较运算符的优先级 int operate(int x,char y,int z); //进行x,z关于y的运算

void main() { AB *p; CD *q; char c,e; int a,b; p=InitStack1(); q=InitStack2(); Push2(q,'#'); c=getchar(); while(c!='#'&&GetTop2(q)!='#') { if(c<='9'&&c>='0') { Push1(p,c); c=getchar(); } else { switch(precede(GetTop2(q),c)) { case -1 : Push2(q,c); c=getchar(); break; case 0 : Pop2(q,e); c=getchar(); break; case 1 : Pop2(q,e); Pop1(p,a); Pop1(p,b); Push1(p,operate(a,e,b)); break; default : break; } } } return GetTop1(p); }

AB* InitStack1() //初始化栈 { AB *p; p=new AB; p->top=0; }

CD* InitStack2() //初始化栈 { CD *q; q=new CD; q->top=0; }

int Empty1(AB *r) { return r->top=0; }

int Empty2(CD *s) { return s->top=0; }

void Push1(AB *r,int a) { if(Full1(r)) cout<<"The stack is full.\n"; else r->data[r->top++]=a; }

void Push2(CD *s,char b) { if(Full2(s)) cout<<"The stack is full.\n"; else s->ch[s->top++]=b; }

int Full1(AB *r) { return r->top=MAX-1; }

int Full2(CD *s) { return s->top=MAX-1; }

void Pop1(AB *r,int m) //出栈并返回栈顶元素m { if(Empty1(r)) cout<<"The stack is empty.\n"; else { m=r->data[r->top]; r->top--; } }

void Pop2(CD *s,char n) //出栈并返回栈顶元素n { if(Empty2(s)) cout<<"The stack is empty.\n"; else { n=s->ch[s->top]; s->top--; } }

int GetTop1(AB *r) { return r->data[r->top-1]; }

char GetTop2(CD *s) { return s->ch[s->top-1]; }

int precede(char c1,char c2) { if((c1=='+')&&(c2=='+'||c2=='-'||c2==')'||c2=='#')) return 1; if((c1=='+')&&(c2=='*'||c2=='/'||c2=='(')) return -1; if((c1=='-')&&(c2=='+'||c2=='-'||c2==')'||c2=='#')) return 1; if((c1=='-')&&(c2=='*'||c2=='/'||c2=='(')) return -1; if((c1=='*')&&(c2=='+'||c2=='-'||c2=='/'||c2==')'||c2=='#')) return 1; if((c1=='*')&&(c2=='*'||c2=='/')) return 1; if((c1=='*'||c1=='/')&&c2=='(') return -1; if((c1=='*'||c1=='/')&&(c2==')'||c2=='#')) return 1; if(c1=='('&&(c2=='+'||c2=='-'||c2=='*'||c2=='/')) return -1; if(c1=='('&&c2==')') return 0; if(c1==')'&&(c2=='+'||c2=='-'||c2=='*'||c2=='/')) return 1; if(c1==')'&&(c2==')'&&c2=='#')) return 1; if(c1=='#'&&(c2=='+'||c2=='-')) return -1; if(c1=='#'&&(c2=='*'||c2=='/')) return -1; if(c1=='#'&&c2==')') return -1; if(c1=='#'&&c2=='#') return 0; }

int operate(int x,char y,int z) { int dd; switch(y) { case '+' : dd=x+z; break; case '-' : dd=x-z; break; case '*' : dd=x*z; break; case '/' : dd=x/z; break; default : break; } return dd; } ////////////////////////////////////////////////////////////////////////////// 以上是我写的程序,但是运行不起来,而且有错。鄙人是一个菜鸟,希望高手们给我教导,谢谢

搜索更多相关主题的帖子: 表达 
2005-09-14 17:36
fire77
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2005-9-19
收藏
得分:0 
很显然你搞的不清楚,写的所以乱
首先:表达市求值用的是后缀市求值,,那么有什么特点呢:先找运算符,再找操作数!
而操作数之间相对次序不变,扫描每一个输入字符,是操作数则进栈,操作符则进入switch判断,eg: case ' * ' : x=pop(s)*pop(s);这时栈顶里弹出2元素进行+ - * /,再将得到的X进栈。。。依次继续扫描直至表空
你可以看看,重新再写一个

2005-10-02 18:25
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
收藏
得分:0 
很显然楼主是下了番功夫的,但运算顺序优先方面考虑的不是很好, 所以写的有点混乱, 建议改进一下运算符的优先级判断方法(我也在思考中), 另外希望楼主给出程序的出错信息来

我的征途是星辰大海
2005-10-03 12:39
fire77
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2005-9-19
收藏
得分:0 
呵呵,我也是初学,但是楼主定义struct 不就是为了避免重复定义的麻烦嘛,  应该把定义放操作符和操作数写在主函数就可以了啊
我准备先遍一个顺序存储结构的栈,编好了大家再一起讨论吧

2005-10-03 16:17
fire77
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2005-9-19
收藏
得分:0 
看看我写的中缀变后缀吧,虽然也有点问题,也许能激发大家的思维,请积极给我意见,呵呵

2005-10-06 13:54
sjbird331
Rank: 1
等 级:新手上路
帖 子:76
专家分:0
注 册:2005-8-5
收藏
得分:0 
谢谢各位对我的程序关爱.
我的precede()函数是用来判断前一个运算符和后一个运算符的优先级,然后进行运算.思路应该没问题,但是precede()函数总是觉得编的不好,想不到什么好的办法.而且总是存在编译问题.
我是用VC编译的,希望大家一起讨论,鄙人也是菜鸟一只,望大家包涵,赐教.
谢谢
2005-10-06 17:59
phoenixcslun
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2005-10-8
收藏
得分:0 
你学的是哪个教材的数据结构?怎么我的教材上栈不是这样定义的,初始化也不一样,我学的是清华大学严蔚敏老师的,她的书上的定义是
typedef  struct{
     selemtype  *base;
    selemtype    *top;
     int     stacksize;
}
用的是两个指针
2005-10-14 13:52
phoenixcslun
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2005-10-8
收藏
得分:0 
你学的是哪个教材的数据结构?怎么我的教材上栈不是这样定义的,初始化也不一样,我学的是清华大学严蔚敏老师的,她的书上的定义是
typedef struct{
selemtype *base;
selemtype *top;
int stacksize;
}
用的是两个指针
2005-10-14 13:55
sjbird331
Rank: 1
等 级:新手上路
帖 子:76
专家分:0
注 册:2005-8-5
收藏
得分:0 
你用的是清华大学的数据结构,我用的是大连理工。的数据结构。其实如果用一个指针的话,相对来说,栈就变为顺序栈。我觉得这样做也可以,你觉得呢?只是最近一直还没把这个问题搞定。
2005-10-16 20:41
wangxb07
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2005-10-16
收藏
得分:0 
晕。。写的那么长!!计算表达式的随便编一个也没那么长啊

2005-10-17 12:30
快速回复:求教:表达式计算
数据加载中...
 
   



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

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