| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 986 人关注过本帖
标题:[求助]算术表达式的求值
只看楼主 加入收藏
为考试而来
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2007-1-11
收藏
 问题点数:0 回复次数:4 
[求助]算术表达式的求值
完成功能:
任意输入一个简单的进行加减乘除运算的表达式,能够输出表达式的值.
如输入:2*3+4/2 输出:8 表达式是任意给顶合法的表达式 (利用栈来完成)
搜索更多相关主题的帖子: 算术 求值 表达 加减乘除 
2007-01-11 15:37
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
利用双栈做,一个保存数,一个处理括号匹配.
以前有过这样的帖,LZ搜一下吧.

倚天照海花无数,流水高山心自知。
2007-01-12 20:25
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
先转换成后缀表达式或前缀表达式,然后循环借助两个栈进行运算
一个保存数,一个保存运算符号.

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2007-01-12 20:55
sundan
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2007-1-17
收藏
得分:0 
我同意楼上兄弟的说法.你可以有链栈存储元素,借助指针进行循环运算.
2007-01-19 23:20
cedricporter
Rank: 1
等 级:新手上路
帖 子:49
专家分:3
注 册:2007-2-6
收藏
得分:0 

/////////////////////////////////////////////////////////////
// File Name : calculator.cpp
/////////////////////////////////////////////////////////////
#include <iostream>
#include <stack>
#include <list>
#include <cmath>
#define NDEBUG

using namespace std;

double toi(char*, int*);
int test(char);

stack<double, list<double> > num;
stack<char, list<char> > op;

int main()
{

op.push('\0');

char exp[100];
cin.getline(exp, 100, '\n');


int n = 0;
int len;
len = strlen(exp);

#ifndef NDEBUG

cout << exp << endl;
#endif

while (exp[n] != '\0')
{
if (exp[n] == ' ')
{
for (int nn = n + 1;nn < len; nn++)
exp[nn-1] = exp[nn];
len--;
n--;
}
n++;
}
exp[len] = '\0';

#ifndef NDEBUG

cout << exp;
#endif

int k;
k = 0;

int flag = 1;

char c;
c = exp[0];

while (flag)
{
if (c >= '0' && c <= '9' || c == '.')
num.push(toi(exp, &k));
else if (c == '(' || test(c) > test(op.top()))
{
op.push(c);
k++;
}
else if (c == '\0' && op.top() == '\0')
flag = 0;
else if (c == ')' && op.top() == '(')
{
op.pop();
k++;
}
else if (test(c) <= test(op.top()))
{
double y = num.top();
num.pop();
double x = num.top();
num.pop();
c = op.top();
op.pop();
switch (c)
{
case '*': x *= y; break;
case '/': x /= y; break;
case '+': x += y; break;
case '-': x -= y; break;
case '^': x = pow(x, y); break;
default : cout << "Error!!\n"; break;
}
num.push(x);
}
c = exp[k];
}
cout << endl << exp << " = " << num.top() << endl << endl;

system("pause");

return 0;
}

double toi(char* c, int* k)
{
double x, y = 1.0;
int flag = 1;
char s;
x = 0.0;
s = c[*k];
while (s >= '0' && s <= '9' || s == '.')
{
*k = *k + 1;
if (s >= '0' && s <= '9')
if (flag == 1)
x = 10*x + (s - 48);
else
{
y *= 0.1;
x += y * (s - 48);
}
else
flag = 0;
s = c[*k];
}

return (x);
}

int test(char c)
{
int x;
switch (c)
{
case '^' : x = 3; break;
case '*' : x = 2; break;
case '/' : x = 2; break;
case '+' : x = 1; break;
case '-' : x = 1; break;
case '(' : x = 0; break;
case ')' : x = 0; break;
case '\0' : x = -1; break;
}
return (x);
}





清脆的口琴聲﹏悠揚的旋律﹏然而︵每個音符︵?°都充滿了悲傷︵?°~↘
2007-02-21 12:33
快速回复:[求助]算术表达式的求值
数据加载中...
 
   



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

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