算法表达式求值演示

2017/10/18

关于算法表达式求值演示(中缀表达式)的project

在这里把代码和我的一些编程过程的体会写下来,虽然都是一些很简单的东西,但是coding的过程体会很重要。

project的主要要求是完成1.算法表达式求值演示2.运算符集的扩充(主要包括乘方运算之类的吧^)3.完成赋值运算

参考书目《数据结构》严蔚敏

算法的基本思想:1.通过栈来实现,可以使用两个工作栈,一个OPTR用于存储运算符(char型);另一个OPND 用于存储操作数和运算结果(我自己用的是double型,int也可以吧,只是涉及到一些运算int就不太够用)2.首先置操作数栈(OPND)为空栈,将‘#’压入运算符栈(OPTR)栈底 3.依次读入表达式中的每个字符(串),若是操作数则进入操作数栈(OPND);若是运算符,则将运算符与运算符栈顶元素进行优先权比较后再进行相应操作(过程三言两语说不太清楚...具体看代码实现) 4.运算符简的优先关系(代码)

代码部分:

//算术表达式求值.cpp

#include <iostream>
#include <cstring>
#include <string>
#include <cstdlib>
#include "Stack.h"//因为要求stack要自己实现,所以是自己写的简单的stack类也可以直接include<stack>
using namespace std;


int Precede(char a, char b)
{//运算符优先关系的比较,返回1表示a的优先权高于b,0表示优先权相等,-1表示a的
switch (a)
{
case '+':
if(b == '+' || '-' || ')' || '#')
return 1;
else
return -1;
break;

case '-':
if(b == '+' || '-' || ')' || '#')
return 1;
else
return -1;
break;

case '*':
if(b == '(')
return -1;
else
return 1;
break;

case '/':
if(b == '(')
return -1;
else
return 1; 
break;

case '(':
if(b == ')')
return 0;
else
return -1;
break;

case ')':
return 1;
break;

case '#':
if(b == '#')
return 0;
else
return -1;
break;
}
}


double Operate(double a, char theta, double b)
{//基本计算
if(theta == '+')
return a + b;
else if(theta == '-')
return a - b;
else if(theta == '*')
return a * b;
else if(theta == '/')
return a / b;
}


double compute(string str)
{//计算string型的中缀表达式
Stack<char>OPTR;
Stack<double>OPND;
char op[8] = "+-*/()#";
OPTR.push('#');
str += '#';

int i = 0;
int j; 
double value, tem1, tem2, d;
char theta;
while(true)
{
j = str.find_first_of(op, i); //从i开始寻找第一个运算符
if(j == string::npos) break;//若找不到运算符了,该操作完成,break
   if(j != i)
{
string temp(str, i, j-i);
value = atof(temp.c_str());
OPND.push(value);
}//操作数进栈

switch(Precede(OPTR.top(), str[j]))
{//比较优先级
case -1:
OPTR.push(str[j]);
i = j + 1;
break;
case 0:
OPTR.pop();
i = j + 1;
break;
case 1:
theta = OPTR.top(); OPTR.pop();
tem2 = OPND.top(); OPND.pop();
tem1 = OPND.top(); OPND.pop();
d = Operate(tem1, theta, tem2);
OPND.push(d);
i = j;
break;
}
}
return OPND.top();
// cout << "The result is:" << endl;
// cout << OPND.top() << endl;
}


bool test(char a, char* data, int len)
{//若a不在字符串data中就返回 true 
for(int i = 0; i < len; ++ i)
{
if(a == data[i])
return false;
}
return true;
}


double assign(string str)
{//赋值运算 输入一个表达式,会自动提示你输入变量的值。操作几乎和compute一样
Stack<char>OPTR;
Stack<double>OPND;
char op[8] = "+-*/()#";
OPTR.push('#');
//string str;
//cout << "请输入赋值运算的表达式:" << endl; 
//cin >> str;
str += '#';

int a;
int b = 0, count = 1;
char data[10];
a = str.find_first_not_of(op, b);
data[0] = str[a];
b = a + 1;
while(1)
{
a = str.find_first_not_of(op, b);
if(a == string::npos) break;
if(test(str[a], data, count))
{
data[count] = str[a];
++ count;
b = a + 1;
}
else
b = a + 1;

}
string assStr;
double value[count];
for(int i = 0; i < count; ++ i)
{
cout << data[i] << '=';
//cin >> value[i];
cin >> assStr;
value[i] = compute(assStr);
}

int i = 0;
int j;
double tem1, tem2, d;
char theta;
while(1)
{
j = str.find_first_of(op, i); 
if(j == string::npos) break;
   if(j != i)
{

for(int k = 0; k < count; ++ k)
{
if(str[j-1] == data[k])
OPND.push(value[k]);
}

}

switch(Precede(OPTR.top(), str[j]))
{
case -1:
OPTR.push(str[j]);
i = j + 1;
break;
case 0:
OPTR.pop();
i = j + 1;
break;
case 1:
theta = OPTR.top(); OPTR.pop();
tem2 = OPND.top(); OPND.pop();
tem1 = OPND.top(); OPND.pop();
d = Operate(tem1, theta, tem2);
OPND.push(d);
i = j;
break;

}
return OPND.top();
// cout << "The result is :"<< endl;
// cout << OPND.top() << endl;

}

int main()
{
char sel;
cout << "你需要做的是:\n" << "A.算数运算     B.赋值运算"<< endl; 
//cin >> sel;
while(cin >> sel)
{
if(sel == 'A')
{
string ss;
cout << "请输入算数运算的式子:"<< endl;
cin >> ss; 
double re = compute(ss);
cout << "结果是\n" << re << endl;  
}

else if(sel == 'B')
{
string str;
cout << "请输入赋值运算的表达式: " << endl; 
cin >> str;
double result = assign(str);
cout << "The result is: " << endl;
cout << result << endl;
}

else
{
return 0;
//cout << "呀! 输错了,请再输一次"<< endl; 
}
}
}

猜你喜欢

转载自blog.csdn.net/qq_40183066/article/details/78279212