C++实现后缀表达式

算法:

·开始扫描;

  ·数字时,加入后缀表达式;

  ·运算符:

  a. 若为最高级的运算符,入栈;

  b. 若为 '(',入栈;

  c. 若为 ')',则依次把栈中的的运算符加入后缀表达式中,直到出现'(',从栈中删除'(' ;

d. 若为不是最高级的运算符,则将从栈顶到第一个优先级不大于(小于,低于或等于)它的运算符(或 '(')之间的运算符加入后缀表达式中,该运算符再入栈;

O(∩_∩)O哈哈~,大家一起交流哈~~

优秀的程序员要解释代码。

我对本人的代码还是挺自信的。。。

其他函数很简单,都是工具函数不解释。

主要看的是那个InfixToSubbfix();函数,该函数,对照楼上的算法就能很容易理解了。

我的结构还是很清晰的。

 

#include <iostream>

#include <vector>

#include <stack>

 

using namespace std;

bool isHigh(char top_op,char Infix_op); // 判断优先级,这个函数我写不好,太冗余了,不知大家怎么写?

bool isOperator(char Infix_op);//判断是不是operator

bool input(vector<char> *infix);//输入中缀表达式,以‘$’结束

void output(vector<char> *suffix);//输入后缀表达式

void InfixToSuffix(vector<char>*infix,vector<char> *suffix,stack<char> *tempStack);//该函数实现转换

 

int main()

{

   stack<char> tempStack;

   vector<char> infix;

   vector<char> suffix;

 

   while(input(&infix))

    {

       InfixToSuffix(&infix,&suffix,&tempStack);

       output(&suffix);

       infix.clear();

       suffix.clear();

    }

   return 0;

}

 

 

bool isHigh(char top_op,char Infix_op)

{

   if(Infix_op=='+'&&top_op=='+') return true;

   if(Infix_op=='+'&&top_op=='-') return true;

   if(Infix_op=='-'&&top_op=='+') return true;

   if(Infix_op=='-'&&top_op=='-') return true;

   if(Infix_op=='*'&&top_op=='*') return true;

   if(Infix_op=='*'&&top_op=='/') return true;

   if(Infix_op=='/'&&top_op=='*') return true;

   if(Infix_op=='/'&&top_op=='/') return true;

   if(Infix_op=='/'&&top_op=='+') return true;

   if(Infix_op=='/'&&top_op=='-') return true;

   if(Infix_op=='*'&&top_op=='+') return true;

   if(Infix_op=='*'&&top_op=='-') return true;

   if(Infix_op=='('&&top_op=='+') return true;

   if(Infix_op=='('&&top_op=='-') return true;

   if(Infix_op=='('&&top_op=='*') return true;

   if(Infix_op=='('&&top_op=='/') return true;

   return false;

}

 

bool isOperator(char Infix_op)

{

   if(Infix_op=='+'||Infix_op=='-'||Infix_op=='/'||Infix_op=='*'

           ||Infix_op=='('||Infix_op==')')

       return true;

   return false;

}

 

bool input(vector<char> *infix)

{

   char c;

    cin>>c;

   while(c!='$')

    {

       if(c!=' ')

           infix->push_back(c);

       cin>>c;

    }

   return true;

}

 

void InfixToSuffix(vector<char>*infix,vector<char> *suffix,stack<char> *tempStack)

{

   for(vector<char>::iterator it=infix->begin();it!=infix->end(); ++it )

    {

       if(!isOperator(*it))

       {

           suffix->push_back(*it);

       }

       else

       {

           if(tempStack->empty())

           {

                tempStack->push(*it);

           }

           elseif(isHigh(tempStack->top(),*it)||tempStack->top()=='(')

           {

                tempStack->push(*it);

           }

           else if(*it==')')

           {

                while(tempStack->top()!='('&&!tempStack->empty())

                {

                   suffix->push_back(tempStack->top());

                    tempStack->pop();

                }

                tempStack->pop();

           }

           else if(!isHigh(tempStack->top(),*it))

           {

                while(!tempStack->empty()&& !isHigh(tempStack->top(),*it) )

                {

                   suffix->push_back(tempStack->top());

                    tempStack->pop();

                }

                tempStack->push(*it);

           }

       }

    }

   while(!tempStack->empty())

    {

       suffix->push_back(tempStack->top());

       tempStack->pop();

    }

}

 

void output(vector<char> *suffix)

{

   for(vector<char>::iterator it=suffix->begin();it!=suffix->end(); ++it )

    {

       cout<<*it;

    }

   cout<<endl;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值