圖 4.14
#include <iostream>
#include <stack>
#include <string>
#include <map>
using namespace std;
map<char, int> m;
char c[200];
struct Node
{
char data;
Node *left, *right;
Node(char c):data(c), left(NULL), right(NULL) {}
};
bool isOperand(char c) // decision 'c' is an operand or not
{
if( c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '1' && c <= '9')
return true;
return false;
}
Node* create_ET(string s) // create an expression tree
{
stack<Node*> st;
Node *temp;
int len = s.length();
for(int i = 0; i < len; i++)
{
if(s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/')
{
temp = new Node(s[i]);
temp->right = st.top();
st.pop();
temp->left = st.top();
st.pop();
st.push(temp);
}
else
{
temp = new Node(s[i]);
st.push(temp);
}
}
return st.top();
}
string change(string s) // convert infix expression into suffix expression
{
int len = s.length();
string temp;
char c[200];
stack<char> cs;
int i,j;
for(i = 0, j = 0; i < len; i++)
{
if( isOperand(s[i]) )
c[j++] = s[i];
else
{
switch ( s[i] )
{
case '(':
cs.push( s[i] );
break;
case ')':
while(cs.top() != '(')
{
c[j++] = cs.top();
cs.pop();
}
cs.pop();
break;
case '+':
case '-':
case '*':
case '/':
while( !cs.empty() && m[s[i]] <= m[cs.top()] )
{
c[j++] = cs.top();
cs.pop();
}
cs.push( s[i] );
break;
}
}
}
if( !cs.empty() )
{
c[j++] = cs.top();
cs.pop();
}
c[j] = '\0';
temp = c;
return temp;
}
void postorder(Node *root) // postorder traversal
{
if(root != NULL)
{
postorder(root->left);
postorder(root->right);
cout << root->data << ' ';
}
}
void preorder(Node *root) // preorder traversal
{
if(root != NULL)
{
cout << root->data << ' ';
preorder(root->left);
preorder(root->right);
}
}
int main()
{
// characterize the priority of operators
m['+'] = 1;
m['-'] = 1;
m['*'] = 2;
m['/'] = 2;
m['('] = 0;
Node *r = create_ET("abc*+de*f+g*+"); // create an expression tree
postorder(r);
cout << endl;
preorder(r);
cout << endl;
string str("(a+(b*c))+(((d*e)+f)*g)");
Node *m = create_ET( change(str) );
postorder(m);
cout << endl;
return 0;
}