四则运算(非递归)

    xiaoxiao2021-12-14  15

    #include<iostream> #include<string> #include<cmath> using namespace std; template<typename E> class Stack { private: E* list; int n; int maxsize; public: Stack(int i = 10) { list = new E[i]; maxsize = i; n = 0; } ~Stack() { delete[] list; maxsize = n = 0; } void push(E c) { if (n == maxsize) { E *temp = new E[maxsize]; for (int i = 0; i<maxsize; i++) temp[i] = list[i]; maxsize *= 2; list = new E[maxsize]; for (int i = 0; i<n; i++) list[i] = temp[i]; } list[n++] = c; } E pop() { if (n == 0) return NULL; return list[--n]; } void print() { int temp = n; for (int i = 0; i<temp; i++) cout << pop() << " "; cout << endl; } int size() { return n; } }; int runhelp(string s, int i, int j); int getNum(string s, int &i, int j); char getOpe(string s, int &i, int j); int run(string s); string remake(string s, int i, int &j, string temp); string tostring(int temp); int main() { int time; cin >> time; cin.get(); for (int i = 0; i < time; i++) { string s; char c; while ((c = cin.get()) != '\n') s += c; int result = run(s); cout << result<<endl; } } int runhelp(string s, int i, int j) { Stack<int> numstack; Stack<char> opestack; bool flag = true; while (i <= j) { if (flag) { int num = getNum(s, i, j); numstack.push(num); } flag = true; if (i > j) break; char ope = getOpe(s, i, j); if (ope == '*' || ope == '/') { int m = numstack.pop(); int n = getNum(s, i, j); int temp; switch (ope) { case '*':temp = m*n; break; case '/':temp = m / n; break; } numstack.push(temp); flag = false; } else opestack.push(ope); } int result = 0; while (opestack.size() != 0) { char c = opestack.pop(); int num = numstack.pop(); switch (c) { case '+':result += num; break; case '-':result += (-num); break; } } result += numstack.pop(); return result; } char getOpe(string s, int &i, int j) { return s[i++]; } int getNum(string s, int &i, int j) { Stack<int> stack; int num = 0; bool flag = true; bool flag1 = true; for (; i <= j; i++) { if (!flag1&&(s[i]=='-'||s[i] == '*' || s[i] == '/' || s[i] == '+')) break; else if (flag&&s[i] == '-')  flag = false; else { int temp = (int)s[i] - 48;stack.push(temp);} flag1 = false; } int length = stack.size(); if (stack.size() == 0) return NULL; else { for (int k = 0; k<length; k++) { int temp = stack.pop()*(int)pow(10.0, k); num += temp; } if(flag) return num; else return -1*num; } } int run(string s) { int i; Stack<int> index; for (i = 0; i<s.length(); i++) { if (s[i] == '(') { index.push(i); } if (s[i] == ')') { break; } } while (index.size() != 0) { int l = index.pop(); int temp = runhelp(s, l + 1, i - 1); string stemp = tostring(temp); s=remake(s, l, i, stemp); for (; i < s.length(); i++) { if (s[i] == '(') { index.push(i); } if (s[i] == ')') { break; } } } return runhelp(s, 0, s.length() - 1); } string tostring(int i) { string s; if (i < 0) { i = -i; s += "-";  } int rtoi; for (rtoi = 1; i / rtoi != 0; rtoi *= 10); if (rtoi == 1) return "0"; for (rtoi /= 10; rtoi != 0; rtoi /= 10) s += (char)((i / rtoi) % 10 + 48); return s; } string remake(string s, int i, int &j, string temp) { string stemp; int k; for (k = 0; k < i; k++) stemp += s[k]; stemp += temp; int t = stemp.length()-1; for (k = j + 1; k < s.length(); k++) stemp += s[k]; j = t; return stemp; }
    转载请注明原文地址: https://ju.6miu.com/read-964538.html

    最新回复(0)