#include<iostream>
#include<string>
#include<map>
using namespace std;
template <class T>
class Stack {
public:
Stack(int size) {
elements = new T[size];
MaxSize = size;
topp =0;
}
~Stack()
{
delete []elements;
}
void OverStack() {
T* NewArray=NULL;
int size = MaxSize;
if (topp >= 0.5 * size) {
NewArray = new T[2 * size], MaxSize *= 2;
for (int i = 0; i < topp; ++i)
NewArray[i] = elements[i];
delete[]elements;
elements = NewArray;
}
}
bool IsFull() {
if (topp == MaxSize + 1)
return 1;
return 0;
}
bool IsEmpty() {
if (topp == 0)
return 1;
return 0;
}
int size() {
return topp;
}
void pop() {
if(!IsEmpty())
--topp;
}
void push(T a) {
OverStack();
++topp;
elements[topp - 1] = a;
}
T top() {
if(!IsEmpty())
return elements[topp - 1];
}
void clear() {
topp = 0;
}
private:
T* elements;
int topp;
int MaxSize;
};
//double ChangeNum(Stack<char>st) {//这个stack在函数结束后进行析构的时候有错 不知道为啥
// double sum=0,i=1;
// while (!st.IsEmpty()) {
// sum += (st.top()-'0') * i;
// st.pop();
// i *= 10;
// }
// return sum;
//}
map<pair<char, char>, bool>ma = { {{'+','+'},1},{{'+','-'},1}, {{'+','*'},0}, {{'+','/'},0}, {{'-','+'},1}, {{'-','-'},1}, {{'-','*'},0}, {{'-','/'},0}, {{'*','+'},1}, {{'*','-'},1}, {{'*','*'},1}, {{'*','/'},1}, {{'/','+'},1}, {{'/','-'},1}, {{'/','*'},1}, {{'/','/'},1} ,{{'+','('},0},{{'-','('},0},{{'*','('},0},{{'/','('},0},{{'(','('},0},{{')','('},0}, {{'+',')'},1}, {{'-',')'},1}, {{'*',')'},1}, {{'/',')'},1}, {{'(',')'},0}, {{')',')'},0},{{'(','+'},0}, {{'(','-'},0}, {{'(','*'},0}, {{'(','/'},0}, {{')','+'},0}, {{')','-'},0}, {{')','*'},0}, {{')','/'},0}, {{'+','\0'},0}, {{'-','\0'},0}, {{'*','\0'},1}, {{'/','\0'},1}, {{'(','\0'},0}, {{')','\0'},0} };
int main() {
Stack<double>NumSt(10);
Stack<char>CNumSt(10),CharSt(10);
string str;
while (cin >> str) {
for (int i = 0; i <= str.size(); ++i) {//别忘了字符串记得以‘\0'作为末尾,结束上述的“去括号”,这样才可以使运算符栈里的运算符都是同等级的
if (str[i] <= '9' && str[i] >= '0')//不支持负数,支持负数的话注意数组是否会越界
CNumSt.push(str[i]);
else {
double sum = 0, j = 1;
while (!CNumSt.IsEmpty()) {
sum += (CNumSt.top() - '0') * j;//别忘记减去字符0
CNumSt.pop();
j *= 10;
}
if(j!=1)//当用到上文的条件判断的时候记得特判,因为sum可以==0,所以用j 作为判断条件
NumSt.push(sum);
if (!CharSt.IsEmpty() && ma[{CharSt.top(), str[i]}]) {
double num2,num1;
num2 = NumSt.top(); NumSt.pop();
num1= NumSt.top(); NumSt.pop();
if (CharSt.top() == '+') {
num2 = num1 + num2;
NumSt.push(num2);
}
if (CharSt.top() == '-') {
num2 = num1 - num2;
NumSt.push(num2);
}
if (CharSt.top() == '*') {
num2 = num1 * num2;
NumSt.push(num2);
}
if (CharSt.top() == '/') {
num2 = num1*1.0 / num2;
NumSt.push(num2);
}
//cout << num2 << endl;
CharSt.pop();
}
if(i!=str.size())
CharSt.push(str[i]);
}
}
Stack<char>C2(10);
Stack<double>N2(10);
while (!CharSt.IsEmpty())//当进行上述操作结束后,将会使表达式成为同等级的,因此操作符和操作数都应该逆置,顺序计算
C2.push(CharSt.top()), CharSt.pop();
while (!NumSt.IsEmpty())
N2.push(NumSt.top()), NumSt.pop();
while (!C2.IsEmpty()) {
if (C2.top() != '(' && C2.top() != ')'){
double num2, num1;
num1 = N2.top(); N2.pop();
num2 = N2.top(); N2.pop();
if (C2.top() == '+') {
num2 = num1 + num2;
N2.push(num2);
}
if (C2.top() == '-') {
num2 = num1 - num2;
N2.push(num2);
}
if (C2.top() == '*') {
num2 = num1 * num2;
N2.push(num2);
}
if (C2.top() == '/') {
num2 = num1 * 1.0 / num2;
N2.push(num2);
}
}
C2.pop();
}
cout << N2.top()<<endl;
NumSt.clear(); CNumSt.clear(); CharSt.clear(); C2.clear(); N2.clear();
}
}
顺序栈实现算术表达式的计算
最新推荐文章于 2022-10-30 16:01:37 发布
该博客详细介绍了如何使用C++编程实现中缀表达式转换为后缀表达式,并对其进行求值。通过自定义栈数据结构,处理运算符的优先级和括号匹配,最终实现对复杂数学表达式的计算。博客内容包括算法设计、代码实现及示例测试。
摘要由CSDN通过智能技术生成