Conversion Algorithm
1、操作符栈压入"#";
2、依次读入表达式的每个单词;
3、如果是操作数则压入操作数栈;
4、如果是操作符,则将操作符栈顶元素与要读入的操作符进行优先级比较
(4.1)如果读入的是 ')',则将操作符栈中的元素压入操作数栈直至遇到 '(';
(4.2)如果读入的是 '(',压入操作符栈;
(4.3)如果栈顶元素优先级低,压入操作符栈;
(4.4)如果读入的元素不为'#',以及栈顶元素优先级高,则将栈顶元素压入操作数栈,将读入的元素压入操作符栈;
(4.5)如果操作符栈为空或操作符栈栈顶元素为 '(',压入操作符栈;
(4.6)其他,将操作符栈元素压出到操作数栈直至遇到'#';
5.将操作数栈元素逆序输出。
//infix to postfix
#include<iostream>
#include<vector>
using namespace std;
struct Node
{
char data;
Node* next;
};
class LinkStack
{
public:
LinkStack()
{
top = new Node;
top = NULL;
}
~LinkStack()
{
delete top;
}
void push(char item);
void pop();
char front() const;
void display()const;
private:
Node*top;
};
void LinkStack::display()const
{
Node*p = top;
vector<char>s = {};
while (p != NULL)
{
s.push_back(p->data);
p = p->next;
}
vector<char>s1 = {};
vector<char>::size_type size = s.size();
for (vector<char>::size_type i = 0; i < size; i++)
s1.push_back(s[size - 1 - i]);
for (auto i : s1)
cout << i;
cout << endl;
}
void LinkStack::push(char item)
{
Node*p = new Node;
p->data = item;
p->next = top;
top = p;
}
void LinkStack::pop()
{
Node*p = top;
top = top->next;
delete p;
}
char LinkStack::front()const
{
return top->data;
}
bool isNum(char c)
{
return (c <= '9' && c >= '0');
}
char Precede(char f, char c)
{
if (f == '+')
{
if (c == '*' || c == '/' || c == '(')return '<';
else return '>';
}
else if (f == '-')
{
if (c == '*' || c == '/' || c == '(')return '<';
else return '>';
}
else if (f == '*')
{
if (c == '(')return '<';
else return'>';
}
else if (f == '/')
{
if (c == '(')return '<';
else return'>';
}
else if (f == '(')
{
if (c == ')')return '=';
else return '<';
}
else if (f == ')')return '>';
else if (f == '#')
{
if (c == '#')return '=';
else return '<';
}
}
void evaluate(LinkStack*SOPTR, LinkStack*SOPND)
{
SOPTR->push('#');
char c;
while (cin >> c)
{
if (isNum(c))
{
SOPND->push(c);
}
else
{
if (c == ')')
{
char c1 = SOPTR->front();
while (c1 != '(')
{
SOPND->push(c1);
SOPTR->pop();
c1 = SOPTR->front();
}
SOPTR->pop();
}
else if (c == '(')
SOPTR->push(c);
else if (Precede(SOPTR->front(), c) == '<')
{
SOPTR->push(c);
}
else if (c!='#'&&Precede(SOPTR->front(), c) == '>')
{
char cha = SOPTR->front();
SOPTR->pop();
SOPTR->push(c);
SOPND->push(cha);
}
else if (SOPTR->front() == '#' || SOPTR->front() == '(')
{
SOPTR->push(c);
}
else
{
char ch = SOPTR->front();
while (ch != '#')
{
SOPND->push(ch);
SOPTR->pop();
ch = SOPTR->front();
}
}
}
}
SOPND->display();
delete SOPND, SOPTR;
}
int main()
{
cout << "input the infix expression:(you must input # to stop input)" << endl;
LinkStack* SOPTR = new LinkStack;
LinkStack* SOPND = new LinkStack;
evaluate(SOPTR, SOPND);
return 0;
}