逆波兰表达式计算(后缀表达式)

#include<iostream>
#include<cstdlib>
#include<cctype>
using namespace std;

template<class T>
class stack
{
private:
    T* base;
    T* top;
    int stackSize;
public:
    stack(int a=100):stackSize(a)
    {
        base=top=new T[stackSize];
    }
    ~stack()
    {
        delete [] base;
        base=top=NULL;
        cout<<"stack析构\n";
    }
    bool is_empty()const;
    bool is_full()const;
    bool pop(T &a);
    bool push(T a);
    int len()const;
};

template<class T>
bool stack<T>::is_empty()const
{
    if(base==top)
        return true;
    else
        return false;
}

template<class T>
bool stack<T>::is_full()const
{
    if(top-base==stackSize)
        return true;
    else
        return false;
}

template<class  T>
bool stack<T>::push(T a)
{
    if(!is_full())
    {
        *(top++)=a;
        return true;
    }
    else
        return false;;

}

template<class T>
bool stack<T>::pop(T& a)
{
    if(!is_empty())
    {
        a=*(--top);
        return true;
    }
    else
        return false;
}

template<class T>
int stack<T>::len()const
{
    cout<<(int*)base<<endl;
    cout<<(int*)top<<endl;
    return top-base;
}

int main()
{
    char c;
    stack<double>s;

    char bluff[10];
    int i=0;

    printf("输入逆波兰表达式,元素之间用空格分开,并以#结束\n");
    scanf("%c",&c);
    while(c!=‘#‘)
    {
        while(isdigit(c) || c==‘.‘)//处理的数是double型的
        {
            bluff[i++]=c;// 用一块缓存区存储char型数据后转换

            if(i>=10)
            {
                printf("\n输入的数过大\n");
                return 1;
            }
            scanf("%c",&c);
            if(‘ ‘==c) // 处理数字后的空格,符号后的空格不管
            {
                bluff[i]=‘\0‘;
                i=0;
                s.push(atof(bluff));
                break;
            }
        }
        if(‘+‘==c || ‘-‘==c || ‘*‘==c || ‘/‘==c)
        {
            double d,e;
            s.pop(d);
            s.pop(e);
            switch(c)
            {
            case ‘+‘:
                s.push(d+e);
                break;
            case ‘-‘:
                s.push(e-d);// 后出的减去前出的
                break;
            case ‘*‘:
                s.push(e*d);
                break;
            case ‘/‘:
                if(d !=0)
                    s.push(e/d);
                else
                {
                    printf("\n除数不能为0\n");
                    return 1;
                }
                break;
            default:
                printf("\n符号不能识别\n");
                return 1;
            }
        }

        scanf("%c",&c);
    }
    double ans;
    s.pop(ans);
    printf("\n计算结果是%f\n",ans);

    return 0;
}
时间: 2024-11-08 12:04:21

逆波兰表达式计算(后缀表达式)的相关文章

逆波兰式(后缀表达式)的计算

输入 :后缀表达式(可带浮点数) 输出:double型的计算结果 代码: #include <stdio.h> #include <stdlib.h> #include <malloc.h> #define ElemType double #define Stack_Init_Size 100 #define Increase_Size 10 #define MaxBuffer 10 typedef struct sqStack { ElemType *top; Ele

中缀表达式检测并转换后缀表达式,计算后缀表达式的结果

实现代码如下 #include <iostream> #include <stack> #include <ctype.h> using namespace std; //这里的数字只能是一位 //扫描表达式是否合法,合法返回0,否则返回非0 int Scanner(const char *str) { stack<char*> s; if(str==NULL) { return -1; } char *p=(char*)str; while(*p!='\0

计算器(表达式计算-后缀表达式实现)

[问题描述] 从标准输入中读入一个整数算术运算表达式,如24 / ( 1 + 2 + 36 / 6 / 2 - 2) * ( 12 / 2 / 2 )= ,计算表达式结果,并输出. 要求: 1.表达式运算符只有+.-.*./,表达式末尾的=字符表示表达式输入结束,表达式中可能会出现空格:2.表达式中会出现圆括号,括号可能嵌套,不会出现错误的表达式: 3.出现除号/时,以整数相除进行运算,结果仍为整数,例如:5/3结果应为1. 4.要求采用逆波兰表达式来实现表达式计算. [输入形式] 从键盘输入一

C++用后缀表达式(逆波兰)求四则表达式值,采用STL中的stack

简介: 20 世纪50 年代, 波兰逻辑学家JanLukasiewicz ,想到了一种不需要括号的后缀表达法,我们也把它称为逆波兰( Reverse Polish Notation, RPN) 表示,对于"如9 + (3 -1 ) X3 +10-/2 " ,如果要用后缀表示法应该是: "9 3 1-3*+10 2 / + " ,这样的表达式称为后缀表达式. 中缀表达式转后缀表达式规则: 从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分

逆波兰表达式——中缀表达式转后缀表达式

逆波兰表达式 先说一下中缀表达式,平时我们使用的运算表达式就是中缀表达式,例如1+3*2,中缀表达式的特点就是:二元运算符总是置于与之相关的两个运算对象之间 人读起来比较好理解,但是计算机处理起来就很麻烦,运算顺序往往因表达式的内容而定,不具规律性 后缀表达式,后缀表达式的特点就是:每一运算符都置于其运算对象之后,以上面的中缀表达式1+2*3为例子,转为后缀表达式就是123*+ 下面先分析怎么把中缀表达式转换为后缀表达式,这里我们考虑六种操作符'+'.'-'.'*'.'/'.'('.')',完成

表达式的计算(中缀表达式转为后缀表达式或逐步计算)

算数表达式的计算,也是很基础的一个问题.花了点时间写了下. 网上很多正确代码.但没有详细说明.虽然不复杂,但是还是写详细点.只有仔细思考过.问题才会在头脑中,觉得简单. 基本有2种方法. 1)中缀表达式转为后缀表达式,是最简洁有力的方法. 2)符合人的计算思路的逐步方法,不推荐使用,只适合锻炼下逻辑能力. 一.中缀表达式转为后缀表达式,是最简洁有力的方法. //更简洁通用的算法,就是把中缀表达式转换为后缀表达式.后缀表达式:不包含括号,运算符放在两个运算对象的后面. //一,无括号的n级符号算法

Python与数据结构[1] -&gt; 栈/Stack[1] -&gt; 中缀表达式与后缀表达式的转换和计算

中缀表达式与后缀表达式的转换和计算 目录 中缀表达式转换为后缀表达式 后缀表达式的计算 1 中缀表达式转换为后缀表达式 中缀表达式转换为后缀表达式的实现方式为: 依次获取中缀表达式的元素, 若元素为操作数(数字/字母等),则加入后缀表达式中 若元素为操作符,则压入栈中,此时对比入栈操作符与栈内元素的计算等级,等级大于或等于入栈元素的栈内操作符都将被弹出栈,加入到后缀表达式中 左括号直接入栈,优先级最高,不弹出栈内元素 右括号不入栈,而是弹出所有元素加入后缀表达式,直至遇见匹配的左括号,并弹出左括

经典白话算法之中缀表达式和后缀表达式

一.后缀表达式求值 后缀表达式也叫逆波兰表达式,其求值过程可以用到栈来辅助存储. 假定待求值的后缀表达式为:6  5  2  3  + 8 * + 3  +  *,则其求值过程如下: (1)遍历表达式,遇到的数字首先放入栈中,依次读入6 5 2 3 此时栈如下所示: (2)接着读到"+",则从栈中弹出3和2,执行3+2,计算结果等于5,并将5压入到栈中. (3)然后读到8(数字入栈),将其直接放入栈中. (4)读到"*",弹出8和5,执行8*5,并将结果40压入栈中

算术表达式的前缀表达式,中缀表达式和后缀表达式

这里所谓的前缀,中缀,后缀是根据操作符的位置来定的,如果操作符在操作数前面,则称为前缀表达式,例如"- + 1 × + 2 3 4 5";如果操作符在操作数之间,则称为中缀表达式,例如 "1+((2+3)×4)-5";如果操作符在操作数后面,则称为后缀表达式,例如"1 2 3 + 4 × + 5 -". 虽然中缀表达式符合人类的日常思维习惯,但是计算机在存储中缀表达式时,需要使用树这种数据结构,如果表达式过于复杂,那么树的高度会变得很高,大大增加

Java版 中缀表达式转换为后缀表达式并求结果

基础知识 平时我们所说的一个算术表达式,例如:9+(3-1)*3+10/2即为中缀表达式,然而计算机无法计算中缀表达式的值,这是因为计算机无法进行带有左右括号和运算符的优先级这种混合运算.后缀表达式(又称 逆波兰式)的使用解决了上述问题. 上述的算术表达式的后缀表达式为:9 3 1 - 3 * + 10 2 / + 算法思想 如何计算上述后缀表达式的结果呢? 答案:从左到右扫描上述后缀表达式,然后: 1. 遇到数字入栈 2. 遇到运算符 将栈顶的前两个元素出栈,然后计算结果,并将计算的结果入栈