| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 15454 人关注过本帖, 4 人收藏
标题:[原创]算术表达式求值演示
只看楼主 加入收藏
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
收藏(4)
 问题点数:0 回复次数:35 
[原创]算术表达式求值演示


我的一个同学找我搞定数据结构的实验报告,因为只有2天的时间,我就胡乱做了个。
下面是运行后生成的应用程序,给大家看看效果。(开始发的那个运行太快,看不见,请重新下载)
这是按照《数据结构习题集》严蔚敏版的实验2.5做的。
至于完整源代码,我下个星期5以后再发出来(呵呵,一点私心,防止上交的报告中有重复的)。
这里把关键的函数发出来。

int power(char x,int &base)// base用来保证括号内运算权限比括号外高(最关键的地方,运算符的权值设定)
{
int power;
if(x=='+'||x=='-')
power=base+1;
if(x=='*'||x=='/')
power=base+2;
if(x=='(')
{
power=3;
base+=3;
}
if(x==')')
{
power=-1;
base+=3;
}
if('0'<=x&&x<='9')
power=0;
}


void guocheng(char *infix)//整个算术表达式运算的过程,请在适当位置自行添加显示OPTR,OPND栈中内容和操作的函数(现在这个函数相当于算法)
{
int a,b,c,base=0,i;
char x,y;

for (i = 0; infix[i] != '\0'; i++)
{
x=infix[i];
if (power(x)==0)//数字就入栈
{
a=x-'0';
push(opnd,a);
}
else if(power(x)==3)// 遇到'('就进栈
{
push(optr,c);
}
else if (power(x)==-1)//')',运算消除一对()
{
a=pop(opnd);
b=pop(opnd);
y=pop(optr);
c=math(b,y,a);
push(opnd,c);
y=pop(optr);
if(y=='('); //考虑如3+5*(3+5*6)
else
{
a=pop(opnd);
b=pop(opnd);
c=math(b,y,a);
push(opnd,c);
pop(optr);
}

}
else
{
if(power(x)>power(top(optr))) //如果运算符权值打于栈顶元素的权值,就入栈
push(optr,x);
else //权值相同情况下就先计算前面的。
{
a=pop(opnd);
b=pop(opnd);
y=pop(optr);
c=math(b,y,a);
push(opnd,c);
push(optr,x);
}
}
}//for
y=pop(optr);
while(y)
{
a=pop(opnd);
b=pop(opnd);
c=math(b,y,a);
push(opnd,c);
y=pop(optr);
}
}


5lWFcR86.rar (30.05 KB) [原创]算术表达式求值演示

这个是老版本了,只有一个可执行文件,请到第3楼下载新版本,有原代码

[此贴子已经被作者于2006-4-25 10:46:35编辑过]



cvSFjLGr.rar (29.91 KB) [原创]算术表达式求值演示

搜索更多相关主题的帖子: 算术 求值 演示 表达 
2005-11-24 11:14
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
收藏
得分:0 
说明一下,像2*2(1+1)这样数子后面直接接'('的表达式非法,12+1这种数字超过了9的表达式非法

我的征途是星辰大海
2005-11-24 11:28
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
收藏
得分:0 
1ww245KF.rar (31.87 KB)

[此贴子已经被作者于2006-4-27 19:10:48编辑过]



YRpbH2V5.jpg (91.3 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册

我的征途是星辰大海
2005-12-25 13:27
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
收藏
得分:0 

前几天忙着考试去了,没有按时发上来,不好意思啊。


我的征途是星辰大海
2005-12-25 13:34
muyilion
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2005-12-26
收藏
得分:0 

谢了,赞一个!

2005-12-27 19:08
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
收藏
得分:0 



看过或用过的朋友给 个意见啊,看看这个程序有什么BUG或不足啊?我好改进。
希望各位不吝赐教啊


我的征途是星辰大海
2006-01-13 11:59
shenjun
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2006-2-20
收藏
得分:0 

你好,有没有详细的程序啊!!急用^^^^^^^^^^^

2006-03-06 17:52
shenjun
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2006-2-20
收藏
得分:0 
哦 ,不好意思,刚才没看见,谢谢!!!
2006-03-06 18:00
poster214
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2006-4-24
收藏
得分:0 

谢谢分享

2006-04-24 09:48
xiao_pig
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2006-4-20
收藏
得分:0 

我也写了一个,支持float型数字……
//建立栈类模板,在主函数中创建两个模板实例


#include<process.h>
#include<string.h>
#define MAX_SIZE 100

template<class T>class Stack
{
T data[MAX_SIZE];
int top;

public:

Stack(void);
~Stack(void);
bool empty(void);
void push(T a);
T pop(void);
T GetTop(void);
};

template <class T>Stack<T>::Stack(void)//构造函数
{
top=-1;
}

template <class T>Stack<T>::~Stack(void)//析构函数
{
}

template <class T>bool Stack<T>::empty(void)//判断栈空操作
{
return top==-1?true :false;
}
template <class T>void Stack<T>::push(T a)//入栈操作
{
if(top==MAX_SIZE)
{
cout<<"Stack is full!"<<endl;
return;
}

data[++top]=a;
}

template <class T>T Stack<T>::pop(void)//出栈操作
{
if(top==-1)
{
cout<<"Stack is underflow!"<<endl;
return 0;
}
return data[top--];
}
template <class T>T Stack<T>::GetTop(void)//取栈头元素操作
{
if(top!=-1)
return data[top];
else return false;
}
//计算表达式求值过程演示


#include<iostream.h>
#include<stdio.h>
#include<math.h>
#include"tstack.h"

float Operate(float a,char theta,float b)
{
float s;
switch(theta)
{
case'+': s=a+b;break;
case'-': s=a-b;break;
case'*': s=a*b;break;
case'/': s=a/b;break;
}
return s;
}


char Precede(char a,char b)
{
char array[7][7]={'>','>','<','<','<','>','>','>','>','<','<','<','>','>','>','>','>','>','<','>','>','>','>','>','>','<','>','>','<','<','<','<','<','=','0','>','>','>','>','0','>','>','<','<','<','<','<','0','='};

int i,j;

switch(a)
{
case'+': i=0;break;
case'-': i=1;break;
case'*': i=2;break;
case'/': i=3;break;
case'(': i=4;break;
case')': i=5;break;
case'#': i=6;break;
}

switch(b)
{
case'+': j=0;break;
case'-': j=1;break;
case'*': j=2;break;
case'/': j=3;break;
case'(': j=4;break;
case')': j=5;break;
case'#': j=6;break;
}

return(array[i][j]);
}

void main()
{
char array[100],x,theta;
char *p,*q,A='y';
float s;
int i;
float v=0.0,a=0.0,b=0.0;
cout<<'\t'<<'\t'<<"****************************************"<<endl;
cout<<'\t'<<'\t'<<" 算术表达式求值 "<<endl;
cout<<'\t'<<'\t'<<"****************************************"<<endl;
cout<<'\t'<<'\t'<<" ------------中国科技大学-------------- "<<endl;
cout<<'\t'<<'\t'<<"|作者: 老大的小猪 |"<<endl;
cout<<'\t'<<'\t'<<"|______________________________________|"<<endl;

while(A=='y')
{
cout<<"请输入表达式(以#号键结束):"<<endl;
p=array;
cin>>array;

Stack<char>OPTR;
Stack<float>OPND;

OPTR.push('#');

while((*p)!='#'||OPTR.GetTop()!='#')
{
if((*p)>='0'&&(*p)<='9')
{
v=0.0;
q=p;
i=-1;
while((*q)>='0'&&(*q)<='9'&&(*q)!='.')
{
i++;
q++;
}


for(;i>=0;i--)
{
s=pow(10,i);
v+=((*p)-'0')*s;
p++;
}

if((*p)=='.')
{
p++;
while((*p)>='0'&&(*p)<='9')
{
s=pow(10,i);
v+=((*p)-'0')*s;
i--;
p++;
}
}
OPND.push(v);
}
else
switch(Precede(OPTR.GetTop(),(*p)))
{
case '<':OPTR.push((*p));
p++;break;
case '=':x=OPTR.pop();
p++;break;
case '>':theta=OPTR.pop();
b=OPND.pop();
a=OPND.pop();
OPND.push(Operate(a,theta,b));
break;
}
}
printf("%f\n",OPND.GetTop());
cout<<"想继续吗(y/n)?";
cin>>A;
}


}


2006-04-27 18:40
快速回复:[原创]算术表达式求值演示
数据加载中...
 
   



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

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