- Rongsen.Com.Cn 版权所有 2008-2010 京ICP备08007000号 京公海网安备11010802026356号 朝阳网安编号:110105199号
- 北京黑客防线网安工作室-黑客防线网安服务器维护基地为您提供专业的
服务器维护
,企业网站维护
,网站维护
服务 - (建议采用1024×768分辨率,以达到最佳视觉效果) Powered by 黑客防线网安 ©2009-2010 www.rongsen.com.cn
作者:黑客防线网安C/C++教程基地 来源:黑客防线网安C/C++教程基地 浏览次数:0 |
表达式求值:
设计一个程序实现输入一个表达式如3*(3+4),以”#”结尾,求出其值。
分析:
古老的问题~
先分析一下四则运算的规则:
1. 先乘除后加减;
2. 从左到右计算;
3. 先括号内后括号外;
于是我们要把运算符的优先级确定清楚。这里我只用这几个运算符:+-*/(),
可以知道+-的优先级低于*/,而对于(),当第一次遇到’(‘时,’(‘后面的就优先计算,直到遇到’)’为止,可以先把’(’的优先级定为比其它几个都高,然后遇到’)’时把里面的先算出来,再算括号外面的,具体实现在代码中会表现得很清楚。
这个程序还是用栈来实现,具体代码如下。
代码:
#include <iostream>
#include <string>
using namespace std;
const int STACK_INIT_SIZE=100; //The maximize length of stack
template <class T> class Stack //A class of stack
{
public:
Stack() //Constructor function
{
base = new int[STACK_INIT_SIZE];
if (!base)
{
cerr<<"Fail to assign memory!"<<endl;
exit(-1);
}
top=base;
stacksize=STACK_INIT_SIZE;
}
~Stack() //Destructor function
{
if (base) delete[] base;
}
T GetTop()
{
if (top==base)
{
cerr<<"Empty!"<<endl;
exit(-1);
}
return *(top-1);
}
void Push(T e)
{
if (top-base>=stacksize)
{
base=new int[STACK_INIT_SIZE];
if(!base)
{
cerr<<"Fail to assign memory!"<<endl;
exit(-1);
}
top=base+STACK_INIT_SIZE;
stacksize+=STACK_INIT_SIZE;
}
*top++=e;
}
void Pop(T& e)
{
if (top==base)
{
cerr<<"Empty!"<<endl;
exit(-1);
}
e=*--top;
}
private:
int *base;
int *top;
int stacksize;
};
string op("+-*/()#"); //The set of operator
bool In(char c,string op) //Judge the character whether belong to the set of operator
{
string::iterator iter=op.begin();
for (;iter!=op.end();++iter)
if (*iter==c) return true;
return false;
}
char Precede(char top,char c) //Confirm the precedence of operator
{
int grade_top=0,grade_c=0;
switch (top)
{
case '#':grade_top=0;break;
case ')':grade_top=1;break;
case '+':grade_top=2;break;
case '-':grade_top=2;break;
case '*':grade_top=3;break;
case '/':grade_top=3;break;
case '(':grade_top=4;break;
}
switch (c)
{
case '#':grade_c=0;break;
case ')':grade_c=1;break;
case '+':grade_c=2;break;
case '-':grade_c=2;break;
case '*':grade_c=3;break;
case '/':grade_c=3;break;
case '(':grade_c=4;break;
}
if (grade_top>=grade_c) {
if (top=='('&&c!=')')
return '<';
else if (top=='('&&c==')')
return '=';
return '>';
}
else if (top=='#'&&c=='#') return '=';
else return '<';
}
int Operate(int a,char theta,int b) //Calculate
{
if (theta=='+') return a+b;
else if (theta=='-') return a-b;
else if (theta=='*') return a*b;
else if (theta==
我要申请本站:N点 | 黑客防线官网 | |
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479 |