【后序式的运算】

/*
后序式的运算

说明:
将中序式转换为后序式的好处是,不用处理运算子先后顺序问题,只要依序由运算式由前往后读取即可。

解法:
运算时由后序式的前方开始读取,遇到运算元先存入堆叠,如果遇到运算子,则由堆叠中取出两个运算元进行对应的运算,然后将
结果存回堆叠,如果运算式读取完毕,那么堆叠顶的值就是答案了,例如我们计算12+34+* 这个运算式
(也就 是(1+2)*(3+4) ):
读取    堆叠
1        1
2        12
+        3
3        33        (1+2后存回)
4        334
+        37         (3+4后存回)
*        21        (3*7后存回)

*/ 

#include <stdio.h>
#include <stdlib.h>

void evalPf(char* );
double cal(double, char, double);

int main(void)
{
    char input[80];
    printf("input the postfix: ");
    scanf("%s", input);
    evalPf(input);
    return 0;
}

void evalPf(char* postfix)
{
    double stack[80] = {0.0};
    char temp[2];
    char token;
    int top = 0, i = 0;

    temp[1] = ‘\0‘;

    while(1)
    {
        token = postfix[i];
        switch(token)
        {
            case ‘\0‘:
                printf("ans = %f \n", stack[top]);
                return;
            case ‘+‘:
            case ‘-‘:
            case ‘*‘:
            case ‘/‘:
                stack[top-1] = cal(stack[top], token, stack[top-1]);
                top--;
                break;
            default:
                if(top < sizeof(stack) / sizeof(float))
                {
                    temp[0] = postfix[i];
                    top++;
                    stack[top] = atof(temp);
                }
                break;
        }
        i++;
    }
}

double cal(double p1, char op, double p2)
{
    switch(op)
    {
        case ‘+‘:
            return p1 + p2;
        case ‘-‘:
            return p1 - p2;
        case ‘*‘:
            return p1 * p2;
        case ‘/‘:
            return p1 / p2;
    }
}
时间: 2024-10-22 18:13:41

【后序式的运算】的相关文章

[经典算法]后序式的运算

题目说明: 通过将中序式转换为后序式,不用处理运算子先后顺序问题,只要依序由运算式由前往后读取即可. 题目解析: 运算时由后序式的前方开始读取,遇到运算元先存入堆叠,如果遇到运算子,则由堆叠中取出两个运算元进行对应的运算,然后将结果存回堆叠,如果运算式读取完 毕,那么堆叠顶的值就是答案了,例如我们计算12+34+*这个运算式(也就是(1+2)*(3+4)): 读取 堆叠 1 1 2 1 2 + 3 // 1+2 后存回 3 3 3 4 3 3 4 + 3 7 // 3+4 后存回 * 21 //

后序式的运算

由于作者不习惯该编辑器,只是贴出上本文的截图,详见:https://www.yuque.com/docs/share/c2e4fb51-00e7-405b-b595-596dd2976017 原文地址:http://blog.51cto.com/4754569/2325354

[经典算法] 中序式转后序式/前序式

题目说明: 平常所使用的运算式,主要是将运算元放在运算子的两旁,例如a+b/d这样的式子,这称之为中序(Infix)表示式,对于人类来说,这样的式子很容易理 解,但由于电脑执行指令时是有顺序的,遇到中序表示式时,无法直接进行运算,而必须进一步判断运算的先后顺序,所以必须将中序表示式转换为另一种表示方 法.可以将中序表示式转换为后序(Postfix)表示式,后序表示式又称之为逆向波兰表示式(Reverse polish notation),它是由波兰的数学家卢卡谢维奇提出,例如(a+b)*(c+d

7.5 中序式转后序式

7-6 toPosfix.c 1 #include <stdio.h> 2 #include <stdlib.h> 3 int PRI(char op) //设定算符的优先级 4 { 5 switch (op) 6 { 7 case '+': 8 case '-': 9 return 1; 10 case '*': 11 case '/': 12 return 2; 13 default: 14 return 0; 15 } 16 } 17 char *toPosfix(char

java 二叉树的遍历 为什么只给出前序以及后序遍历,不能生成唯一的二叉树

最近在学习java的数据结构与算法知识,看到数据结构 树的遍历的方式.在理解过程中.查看到一篇文章,视野非常有深度,在信息论的角度看待这个问题.在此贴出该文章的链接以及内容. [文章出处]http://www.binarythink.net/2012/12/binary-tree-info-theory/ 我们在学习二叉树的遍历时,都会不可避免的学到二叉树的三种遍历方式,分别是遵循(根-左-右)的前序遍历.遵循(左-根-右)的中序遍历以及遵循(左-右-根)的后序遍历.并且每一个二叉树都可以用这三

二叉树的先序/中序/后序/层次遍历

[简介] 树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用. 二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作"左子树"(left subtree)和"右子树"(right subtree).二叉树常被用作二叉查找树和二叉堆或是二叉排序树.二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒.二叉树的第i层至多有2的 i -1次方个结点:深度为k的二叉树至多有2^(k) -1个结点:对任何一棵二叉树T,

算法实验-二叉树的创建和前序-中序-后序-层次 遍历

对于二叉树的创建我是利用先序遍历的序列进行创建 能够对于树节点的内容我定义为char型变量 '0'为空,即此处的节点不存在 头文件 Tree.h //链式二叉树的头文件 #pragma once #include<iostream> #include<queue> using namespace std; class BinaryTreeNode { public: char data; BinaryTreeNode *leftChild,*rightChild; BinaryTr

“中序表达式”转换为“前序表达式”、“后序表达式”

首先看下面所示表格: 中序表达式 2*3/(2-1)+3*(4-1) 前序表达式 +/*23-21*3-41 后序表达式 23*21-/341-*+ 中序表达式对我们而言是很直观的(我们平时接触的就是这个),但计算机处理起来比较麻烦(括号.优先级之类的),前序和后序表达式中没有括号,而且在计算中只需单向扫描,不需要考虑运算符的优先级. 以前序表达式“+/*23-21*3-41”为例,从右往左,先取出两个操作数“1”.“4”和一个运算符“-”,计算“4-1”,将结果3回填到字符串中,现在字符串变为

二叉树基本操作:前序、中序、后序遍历(递归方式)

二叉树是最常见最重要的数据结构之一,它的定义如下: 二叉树(binary tree)是有限多个节点的集合,这个结合或者是空集,或者由一个根节点和两颗互不相交的.分别称为左子树和右子树的二叉树组成. 二叉树最基本的操作是遍历:一般约定遍历时左节点优先于右节点,这样根据根节点的遍历顺序可分为三种遍历操作:前序-先遍历根节点,再处理左右节点:中序-先遍历左节点,然后处理根节点,最后处理右节点:后序-先遍历左右节点,然后处理根节点. 从上边二叉树定义可以看出:二叉树使用了递归的概念描述.所以,二叉树的很