#include<iostream> #include<string> #include<cstring> using namespace std; typedef struct StackNode* LStack; struct StackNode { char data; LStack next; }; void InitStack(LStack &s) { s = NULL; } void Creat(LStack &s, char a) { LStack p = new StackNode; p->data = a; p->next = s; s = p; } void Pop(LStack &s) { LStack q; q = s; s = s->next; delete q; } char GetTop(LStack &s) { if (s == NULL) return NULL; return s->data; } int f(char s)//优先级 { int p; if (s == '*' || s == '/') p = 2; else if (s == '+' || s == '-') p = 1; return p; } int main() { string s; while (cin >> s && s != "=") { LStack q; InitStack(q);//中间结果 LStack p;//运算符 InitStack(p); for (int i = 0; i < s.size(); i++) { if (s[i] >= '0'&&s[i] <= '9') { Creat(q, s[i]); } else { if (s[i] == '(') Creat(p, s[i]); else if (s[i] == ')') { while (GetTop(p) != '(') { Creat(q, GetTop(p)); Pop(p); } Pop(p); } else { if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/') { while (1) { int pp = f(s[i]);//得到优先级 if (GetTop(p) == '(' || p == NULL) { Creat(p, s[i]); break; } else { int qq = f(GetTop(p)); if (qq <pp) { Creat(p, s[i]); break; } else if (pp <=qq) { Creat(q, GetTop(p)); Pop(p); } } } } else if (s[i] == '=') { while (p) { Creat(q, GetTop(p)); Pop(p); } } } } } char t[1000]; int count = 0; for (int i = 0;; i++) { t[i] = GetTop(q); Pop(q); count++; if (q == NULL) break; } for (int i = count - 1; i > 0; i--) { cout << t[i]; } cout << t[0] << endl; } return 0; }
错误原因:
1、没有考虑到运算符栈空的时候,运算符怎么push
2、当s[i]是运算符的时候,而且和p栈顶元素的优先级一样的话,怎么处理。