看到数据结构,实现一个表达式树,需要将中缀表达式转换为后缀来处理,自己试着写了一下。应该问题不少。
- /********************************************************************
- created: 2008/11/09
- created: 9:11:2008 15:20
- file base: Main
- file ext: cpp
- author: Ai
- purpose: 中缀表达式转为后缀表达式
- *********************************************************************/
- #include <iostream>
- #include <vector>
- #include <stack>
- #include <algorithm>
- using namespace std;
- int Priority(char sign)//判断符号优先级
- {
- switch(sign)
- {
- case '(':
- return 0;
- case '+':
- case '-':
- return 1;
- case '*':
- case '/':
- return 2;
- }
- }
- void InfixToPostfix(vector<char> &v,vector<char> &Output)//将中缀表达式转为后缀表达式
- {
- stack<char> sign;
- vector<char>::iterator iter = v.begin();
- char temp;
- while(iter != v.end())
- {
- switch(*iter)
- {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- Output.push_back(*iter);//数字直接放入输出序列中
- break;
- case '(':
- sign.push(*iter);//左括号直接放入栈中
- break;
- case ')'://遇到右括号时把栈中左括号之前的符号全部放到输出序列中,并删除左括号
- {
- do
- {
- temp = sign.top();
- Output.push_back(temp);
- sign.pop();
- } while (sign.top() != '(');
- sign.pop();
- break;
- }
- default://处理+、-、*、/符号
- {
- if(sign.empty())//如果栈为空,直接压栈
- {
- sign.push(*iter);
- break;
- }
- else//否则先把比当前符号优先级大的符号全部放入输出序列,在把该符号压栈
- {
- while(!sign.empty()&&Priority(*iter) <= Priority(sign.top()))
- {
- Output.push_back(sign.top());
- sign.pop();
- }
- sign.push(*iter);
- break;
- }
- }
- }
- iter++;
- }
- while(!sign.empty())//把栈中符号全部放入输出序列
- {
- Output.push_back(sign.top());
- sign.pop();
- }
- }
- int main()
- {
- vector<char> v,Output;
- char temp;
- while(cin>>temp&&temp != '#')//输入一个表达式以#结尾,比如:1+2*3+(4*5+6)*7#
- v.push_back(temp);
- InfixToPostfix(v,Output);
- copy(Output.begin(),Output.end(),ostream_iterator<char>(cout));//输出
- return 0;
- }