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

#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
sjbird331
Rank: 1
等 级:新手上路
帖 子:76
专家分:0
注 册:2005-8-5
收藏
得分:0 
谢谢各位对我的程序关爱.
我的precede()函数是用来判断前一个运算符和后一个运算符的优先级,然后进行运算.思路应该没问题,但是precede()函数总是觉得编的不好,想不到什么好的办法.而且总是存在编译问题.
我是用VC编译的,希望大家一起讨论,鄙人也是菜鸟一只,望大家包涵,赐教.
谢谢
2005-10-06 17:59
sjbird331
Rank: 1
等 级:新手上路
帖 子:76
专家分:0
注 册:2005-8-5
收藏
得分:0 
你用的是清华大学的数据结构,我用的是大连理工。的数据结构。其实如果用一个指针的话,相对来说,栈就变为顺序栈。我觉得这样做也可以,你觉得呢?只是最近一直还没把这个问题搞定。
2005-10-16 20:41
sjbird331
Rank: 1
等 级:新手上路
帖 子:76
专家分:0
注 册:2005-8-5
收藏
得分:0 
不是吧?您做一个
2005-10-20 10:50
快速回复:求教:表达式计算
数据加载中...
 
   



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

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