• 表达式求值和后缀表达式


    /*
     * biao.cpp
     *
     *  Created on: 2011-11-25
     *      Author: allenjin
     */
    
     #include<iostream>
    #include<string.h>
     using namespace std;
      template<class T>
      class Stack{   //自定义堆栈公式化描述
      public:  Stack(){Top=0;}
             T top(){return a[Top];}
           void pop(){Top--;}
           bool isempty(){
             if(Top==0)return true;
              else   return false;}
           void push(T b)
              {
                Top++;
                a[Top]=b;}
     private:
             T a[100];int Top;
     };
     void chpost(char inorder[],char post[],int& m)//将中缀表达式转换为后缀表达式,参数m跟踪后缀表达式长度
     {
         int n=strlen(inorder);//获取中缀表达式的长度
           Stack<char> czf;//定义一个char型堆栈用于存放操作符;
        for(int i=0;i<n;i++)
         {
               if(inorder[i]>='0'&&inorder[i]<='9')//若为操作数,直接添加到后缀表达式数组中
               {
                   post[m]=inorder[i];
                    m++;
                   }
               if(inorder[i]=='(')czf.push(inorder[i]);//若为‘(’直接压入堆栈
               if(inorder[i]=='+')//若为‘+’与栈顶比较优先级,较低则将栈顶操作符加到数组中,在将‘+’压栈
                  {
                      if(!czf.isempty()&&(czf.top()=='*'||czf.top()=='/'||czf.top()=='-'))
                          { post[m++]=czf.top();czf.pop();czf.push(inorder[i]);}
                      else{czf.push(inorder[i]);}
                  }
                if(inorder[i]=='-')//若为‘-’与栈顶比较优先级,较低则将栈顶操作符加到数组中,将‘-’压栈
                {
                    if(!czf.isempty()&&(czf.top()=='*'||czf.top()=='/'))
                    {
                        post[m++]=czf.top();czf.pop();czf.push(inorder[i]);
                    }else{czf.push(inorder[i]);}
                }
                if(inorder[i]=='*'||inorder[i]=='/')czf.push(inorder[i]);//若为‘*’或‘/’直接压栈
                if(inorder[i]==')')//若遇到‘)’将栈中的操作符依次弹出直到遇到‘(’结束
                {
                   while(czf.top()!='(')
                   {post[m++]=czf.top();czf.pop();}
                      czf.pop();//弹出‘(’
                 }
          }
           while(!czf.isempty())//将栈中剩余元素依次弹出到后缀表达式数组中
                 {post[m++]=czf.top();czf.pop();}
     }
    int yusuan(char post[],int n)//通过后缀表达式求值
    {
           Stack<int>ss;//定义int型堆栈存放操作数及每次运算结果
            int a,b,c,result;
       for(int i=0;i<n;i++)
    {
           if(post[i]>='0'&&post[i]<='9')
             {
                  ss.push((post[i]-'0'));//将char型转为int型
              }
    
                  if(post[i]=='-')
                     {
                       b=ss.top();ss.pop();a=ss.top();ss.pop();
                       c=a-b;ss.push(c);
                   }
                  if(post[i]=='+')
                     {
                       b=ss.top();ss.pop();a=ss.top();ss.pop();
                       c=a+b;ss.push(c);
                     }
                  if(post[i]=='*')
                     {
                       b=ss.top();ss.pop();a=ss.top();ss.pop();
                       c=a*b;ss.push(c);
                     }
                  if(post[i]=='/')
                     {
                       b=ss.top();ss.pop();a=ss.top();ss.pop();
                       c=a/b;ss.push(c);
                     }
     }
             result=ss.top();//得到最后栈顶元素
              ss.pop();//清空栈
              return result;
    }
    int main(void)
     {
    
         char in[100];char a;int i=0;
         cout<<"请输入中缀表达式(#表示结束):";
          while(cin>>a)//循环获取输入直到遇到‘#’结束
          {
              if(a=='#')break;
              in[i++]=a;
          }
         char po[100];int n=0;
         chpost(in,po,n);
         cout<<"后缀表达式为:";
         for(int j=0;j<n;j++)cout<<po[j]<<"";
         cout<<endl;
         cout<<"运算结果为:"<<yusuan(po,n)<<endl;
      return 0;
    }
    

      

  • 相关阅读:
    mfc crc校验工具
    MFC 配置附加目录
    多线程中如何使用gdb精确定位死锁问题
    符号冲突
    动态库之间单例模式出现多个实例(Linux)
    c++普通函数在头文件定义报重复定义的错误。而class定义不会
    static初始化顺序及延伸
    tcmalloc使用中出现崩溃问题记录
    shell脚本—判断***是否安装
    【1080TI驱动+CUDA10.1+cudnn】安装记录
  • 原文地址:https://www.cnblogs.com/xiaofanke/p/2978224.html
Copyright © 2020-2023  润新知