中缀转后缀表达式并求值

通过栈将中缀表达式转换为后缀表达式并根据后缀表达式求解,包含的Header.h为之前发过的栈操作相关函数实例程序,改成头文件就行。练习+记录,高手无视。

OutPut:

The init formula:3+4*5+(6*7+8)*9
The stack is empty.
Convert result:345*+67*8+9*+
Calculate result:473

//Code by Pnig0s1992
//Date:2012,3,21
#include <stdio.h>
#include <Windows.h>
#include "Header.h"  

#define MAXLENGTH 50  

VOID ConvertAndCalc(LPSTR lpContainer,Stack S);
int Caculate(LPSTR lpContainer,Stack S);
int getOptPriv(CHAR cOpt);  

int main(int argc,char **argv)
{
    LPSTR lpContainer = "3+4*5+(6*7+8)*9";
    Stack myStack = CreateStack();
    printf("\nThe init formula:%s",lpContainer);
    ConvertAndCalc(lpContainer,myStack);
    system("pause");
    return 0;
}  

int getOptPriv(CHAR cOpt)
{
    switch(cOpt)
    {
    case '(':
        return 7;
    case ')':
        return 7;
    case '*':
        return 5;
    case '/':
        return 5;
    case '+':
        return 3;
    case '-':
        return 3;
    default:
        return 0;
    }
}  

VOID ConvertAndCalc(LPSTR lpContainer,Stack S)
{
    LPSTR lpResult = (LPSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAXLENGTH);
    LPSTR lpTemp = (LPSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAXLENGTH);
    while(*lpContainer != '\0')
    {
        if(isalnum(*lpContainer))
        {
            sprintf(lpTemp,"%c",*lpContainer);
            strcat(lpResult,lpTemp);
            ZeroMemory(lpTemp,MAXLENGTH);
        }else
        {
            if(isEmpty(S))
            {
                Push(*lpContainer,S);
            }else if (*lpContainer == ')')
            {
                while(!isEmpty(S) && getTop(S) != '(')
                {
                    sprintf(lpTemp,"%c",Pop(S));
                    strcat(lpResult,lpTemp);
                    ZeroMemory(lpTemp,MAXLENGTH);
                }
                Pop(S);
            }else
            {
                if(getOptPriv(getTop(S)) < getOptPriv(*lpContainer))
                {
                    Push(*lpContainer,S);
                }else
                {
                    while((!isEmpty(S)) && (getOptPriv(getTop(S)) >= getOptPriv(*lpContainer)) && getTop(S) != '(')
                    {
                        sprintf(lpTemp,"%c",Pop(S));
                        strcat(lpResult,lpTemp);
                        ZeroMemory(lpTemp,MAXLENGTH);
                    }
                    Push(*lpContainer,S);
                }
            }
        }
        lpContainer++;
    }
    while(!isEmpty(S))
    {
        sprintf(lpTemp,"%c",Pop(S));
        strcat(lpResult,lpTemp);
        ZeroMemory(lpTemp,MAXLENGTH);
    }
    MakeEmpty(S);
    printf("\nConvert result:%s",lpResult);
    int iResult = Caculate(lpResult,S);
    printf("\nCalculate result:%d",iResult);
    return;
}  

int Caculate(LPSTR lpContainer,Stack S)
{
    int iTemp;
    int iResult;
    while(*lpContainer != '\0')
    {
        if(isdigit(*lpContainer))
        {
            LPSTR lpTemo = (LPSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAXLENGTH);
            sprintf(lpTemo,"%c",*lpContainer);
            Push(atoi((const char *)lpTemo),S);
        }else
        {
            switch(*lpContainer)
            {
            case '+':
                Push(Pop(S)+Pop(S),S);
                break;
            case '-':
                Push(Pop(S)-Pop(S),S);
                break;
            case '*':
                Push(Pop(S)*Pop(S),S);
                break;
            case '/':
                Push(Pop(S)/Pop(S),S);
                break;
            default:
                break;
            }
        }
        lpContainer++;
    }
    return Pop(S);
}

本文出自 “About:Blank H4cking” 博客,请务必保留此出处http://pnig0s1992.blog.51cto.com/393390/812563

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索return
, 表达式
, 中缀表达式
, case
, pop
, 表达式后缀
, 后缀表达式
maxlength
中缀表达式求值、java中缀表达式求值、中缀表达式求值算法、c语言中缀表达式求值、中缀表达式求值 c,以便于您获取更多的相关知识。

时间: 2024-08-29 08:16:43

中缀转后缀表达式并求值的相关文章

利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现

#!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Data Structures>> # Release 3.0 # chengang882 @ 2016-12-20 # 它可以将常见的中缀表达式转换成后缀表达式,并计算这个表达示的值 # Completed implementation of a stack ADT #数据结构 class Stac

struct-中缀表达式转换成后缀表达式,求大神帮忙找下错误,谢谢

问题描述 中缀表达式转换成后缀表达式,求大神帮忙找下错误,谢谢 #include #include typedef struct huozhui{ char c; struct huozhui next; }huozhui; void push(huozhui *L,char x) { huozhui *p=(huozhui *)malloc(sizeof(huozhui)); p->c=x; p->next=L->next; L->next=p; } int isoperator

malloc-数据结构用栈实现算术表达式的求值运算

问题描述 数据结构用栈实现算术表达式的求值运算 小白一枚,最近用栈实现算术表达式的求值运算结果出现好多问题,单独的加减乘除运算都能够实现,但一旦加上括号运算就停在那命令窗口也不能输入信息,跪求大神指点原因 附上代码和截图: #include #include #include #define STACK_INIT_SIZE 100 //存储空间初始分配量; #define S 10 //存储空间分配增量; #define OK 1 #define ERROR 0 typedef int Elem

前缀、中缀和后缀表达式

关键字:概念, 前缀表达式, 前缀记法, 中缀表达式, 中缀记法, 波兰式, 后缀表达式, 后缀记法, 逆波兰式 它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前:中缀和后缀同理. 举例:(3 + 4) × 5 - 6 就是中缀表达式- × + 3 4 5 6 前缀表达式3 4 + 5 × 6 - 后缀表达式 中缀表达式(中缀记法)中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀

Maxima表达式、求值、化简

Maxima 是一个处理数学表达式的系统,例如x + y, sin(a + bπ)以及u · v − v · u Maxima 并不太关心表达式的含义,一个表达式是否有意义由使用者来判断. 有时你想给未知数赋值并且要计算表达式的值.Maxima 很善长做这件事.但是Maxima 也很善长推迟赋值;你可以先对表达式做一番处理,然后才给(也许永远不给)未知数赋值. 我们先看几个例子: 1.我想计算球的体积. (%i1) V: 4/3 *&http://www.aliyun.com/zixun/agg

求解答一下-java问题 中缀表达式写成后缀表达式

问题描述 java问题 中缀表达式写成后缀表达式 第五题 求解答............................ 解决方案 中缀表达式转换为前缀及后缀表达式并求值(java实现)java 中缀表达式转后缀表达式java中缀表达式转后缀表达式

用C语言写解释器(二)——表达式求值

声明 为提高教学质量,我所在的学院正在筹划编写C语言教材.<用C语言写解释器>系列文章经整理后将收入书中"综合实验"一章.因此该系列的文章主要阅读对象定为刚学完C语言的学生(不要求有数据结构等其他知识),所以行文比较罗嗦,请勿见怪.本人水平有限,如有描述不恰当或错误之处请不吝赐教!特此声明. 内存管理 既然是表达式求值,自然需要在内存中保存计算结果以及中间值.在<用C语言写解释器(一)>中提过:变量要求是若类型,而 C 语言中的变量是强类型,为实现这个目标就需要

java实现任意四则运算表达式求值算法_C 语言

本文实例讲述了java实现任意四则运算表达式求值算法.分享给大家供大家参考.具体分析如下: 该程序用于计算任意四则运算表达式.如 4 * ( 10 + 2 ) + 1 的结果应该为 49. 算法说明: 1. 首先定义运算符优先级.我们用一个 Map<String, Map<String, String>> 来保存优先级表.这样我们就可以通过下面的方式来计算两个运算符的优先级了: /** * 查表得到op1和op2的优先级 * @param op1 运算符1 * @param op2

MYSQL表达式求值和MYSQL类型转换

    2.4 表达式求值和类型转换    MySQL允许编写包括常量.函数调用和表列引用的表达式.这些值可利用不同类型的运算符进行组合,诸如算术运算符或比较运算符.表达式的项可用圆括号来分组.表达式在SELECT 语句的列选择列表和WHERE 子句中出现得最为频繁,如下所示:    所选择的每列给出了一个表达式,如WHERE 子句中所示的那样.表达式也出现在DELETE 和UPDATE语句的WHERE 子句中,以及出现在INSERT 语句的VALUES( ) 子句中.    在MySQL遇到一