Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <locale>
- using namespace std;
- short privilege(char ch) {
- if (ch == '+' || ch == '-') {
- return 1;
- }
- if (ch == '*' || ch == '/') {
- return 2;
- }
- if (ch == '^') {
- return 3;
- }
- return 0;
- }
- //LIFO - last in first out
- template<typename T>
- struct Stack {
- T* arr=nullptr;
- int size = 0, max_size=1000;
- };
- template<typename T>
- void push(Stack<T>& s, T t) {
- if (s.size == 0) { s.arr = new T[++s.size]; s.arr[0] = t; return; }
- T* tmp_arr = new T[++s.size];
- for (int i = 0; i < s.size - 1; i++) tmp_arr[i] = s.arr[i];
- tmp_arr[s.size - 1] = t;
- delete[] s.arr;
- s.arr = tmp_arr;
- }
- template<typename T>
- bool empty(Stack<T> s) {
- return (s.arr == nullptr || s.size == 0) ? true : false;
- }
- template<typename T>
- T top(Stack<T> s) {
- return s.arr[s.size - 1];
- }
- template<typename T>
- T pop(Stack<T>& s) {
- T t = s.arr[--s.size];
- if (s.size == 0) { delete[] s.arr; return t; }
- T* tmp_arr = new T[s.size];
- for (int i = 0; i < s.size; i++) tmp_arr[i] = s.arr[i];
- delete[] s.arr;
- s.arr = tmp_arr;
- return t;
- }
- string inf2post(string n) {
- string post;
- Stack<char> op;
- for (char el : n) {
- if (isalnum(el)) post.push_back(el);
- else if (el == '(') {
- push(op, el);
- }
- else if (el == ')') {
- while (!empty(op) && top(op) != '(') {
- post.push_back(pop(op));
- if (top(op) == '(') { pop(op); break; }
- }
- }
- else {
- if (empty(op) || top(op) == '(') push(op, el);
- else if (privilege(el) > privilege(top(op))) { push(op, el); }
- else {
- while (!empty(op) && top(op) != '(' && privilege(el) <= privilege(top(op))) {
- post.push_back(pop(op));
- }
- push(op, el);
- }
- }
- }
- while (!empty(op)) {
- post.push_back(pop(op));
- }
- return post;
- }
- int main() {
- string q = inf2post("m/(n+k*p-x)*z^k");
- cout << q;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement