后缀表达式的特点如下:
1、后缀表达式的操作数与中缀表达式的操作数先后次序相同,而运算符的先后次序不同。
2、后缀表达式中没有括号,而且运算符没有优先级。
3、后缀表达式计算过程严格按照从左到右的顺序进行。
例如:
算术表达式a+(b-c)*d的后缀式是:abc-d*+
在输入的时候出了问题:
string s;
cin>>s; 不能输入空格
所以要用getline
getline(cin,s);
头文件 string 或者istream
#include<iostream> #include<string> #include<istream> #include<cstring> #include<iomanip> using namespace std; typedef struct StackNode *LStack; struct StackNode { double nu; LStack next; }; void Init(LStack &s) { s = new StackNode; s = NULL; } void Pushnu(LStack &s, double c) { LStack p = new StackNode; p->nu = c; p->next = s; s = p; } void Pop(LStack &s) { LStack p; p = s; if (!s->next) s = NULL; else s = s->next; delete p; } double GetTopnu(LStack &s) { return s->nu; } int main() { string s; s = ""; cout << setiosflags(ios::fixed) << setprecision(2); while (s != "=") { getline(cin, s); char *ptr; int length = 0; LStack p;//s1是数字,s2是运算符 Init(p); for (int i = 0; i <s.size(); i++) { if (s[i] >= '0'&&s[i] <= '9') { Pushnu(p, s[i] - 48); } else if (s[i] == '+') { double a, b; a = GetTopnu(p); Pop(p); b = GetTopnu(p); Pop(p); double c; c = a + b; Pushnu(p, c); } else { if (s[i] == '-') { double a, b; a = GetTopnu(p); Pop(p); b = GetTopnu(p); Pop(p); double c; c = b - a; Pushnu(p, c); } else if (s[i] == '*') { double a, b; a = GetTopnu(p); Pop(p); b = GetTopnu(p); Pop(p); double c; c = b * a; Pushnu(p, c); } else { if (s[i] == '/') { double a, b; a = GetTopnu(p); Pop(p); b = GetTopnu(p); Pop(p); double c; c = b / a; Pushnu(p, c); } else if (s[i] == '=') break; else if (s[i] == ' ') { continue; } } } } if (s == "=") return 0; cout << p->nu << endl; } return 0; }