逆波兰表达式的C实现

复习下数据结构,用栈简单实现逆波兰表达式,参考文档:

http://www.nowamagic.net/librarys/veda/detail/2307
http://www.nowamagic.net/librarys/veda/detail/2306

直接上代码:

/**
*code by lichmama from cnblogs.com
*@逆波兰表达式的C实现
*算术支持的运算模式:
*   四则运算;
*   操作数不得大于9;
*   中间数(即运算当中的临时变量)不得超过127
**/
#include <stdio.h>
#include <stdlib.h>

typedef struct __STACK__ {
    char op;
    struct __STACK__ *next;
}STACK, *PSTACK;

void init(PSTACK *);
void push(PSTACK *, char);
void pop(PSTACK *, char *);
void clear(PSTACK *);
void destroy(PSTACK *);

char getoplevel(char op){
    if(op==‘+‘ || op==‘-‘)
        return 1;
    if(op==‘*‘ || op==‘/‘)
        return 2;
    return 0;
}

char calc(char *rpn){
    char *p=rpn;
    char e;
    int x, y;
    PSTACK pStack;
    init(&pStack);
    while(*p){
        if(0<=*p && *p<=9){
            push(&pStack, *p);
        }else {
            pop(&pStack, &e);x=e;
            pop(&pStack, &e);y=e;
            switch(*p){
                case ‘+‘:push(&pStack, y+x);break;
                case ‘-‘:push(&pStack, y-x);break;
                case ‘*‘:push(&pStack, y*x);break;
                case ‘/‘:push(&pStack, y/x);break;
            }
        }
        p++;
    }
    pop(&pStack, &e);
    free(pStack);pStack=NULL;
    return e;
}

int main(void){
    char e;
    char old_exp[]="(3-1)*3+8/2+(9*3/(2+1)+3*4/6)-2=";
    char rpn_exp[256]="";
    char *p=old_exp;
    char *r=rpn_exp;
    PSTACK gStack;
    init(&gStack);
//
    while(*p!=‘\0‘ && *p!=‘=‘){
        if(‘0‘<=*p && *p<=‘9‘){
            *r++=(*p-‘0‘);
        }else if(*p==‘(‘){
            push(&gStack, ‘(‘);
        }else if(*p==‘)‘){
            for(;;){
                pop(&gStack, &e);
                if(e==‘(‘)break;
                *r++=e;
            }
        }else if(*p==‘+‘ || *p==‘-‘ || *p==‘*‘ || *p==‘/‘){
            if(getoplevel(gStack->op)<getoplevel(*p)){
                push(&gStack, *p);
            }else{

                for(;;){
                    pop(&gStack, &e);
                    if(getoplevel(e)<getoplevel(*p)){
                        if(e!=‘#‘)push(&gStack, e);
                        push(&gStack, *p);break;
                    }
                    *r++=e;
                }
            }
        }
        p++;
    }
    for(;;){
        pop(&gStack, &e);
        if(e==‘#‘)break;
        *r++=e;
    }
    //printf("%s\n", rpn_exp);
    printf("%d\n", calc(rpn_exp));
//
    clear(&gStack);
    destroy(&gStack);
    return 0;
}

void init(PSTACK *s){
    *s=(PSTACK)malloc(sizeof(STACK));
    (*s)->op=‘#‘;
    (*s)->next=NULL;
}

void push(PSTACK *s, char e){
    PSTACK p=(PSTACK)malloc(sizeof(STACK));
    p->op=e;
    p->next=*s;
    *s=p;
}

void pop(PSTACK *s, char *e){
    if((*s)->next){
        PSTACK p=(*s);
        *e=(*s)->op;
        *s=(*s)->next;
        free(p);
        p=NULL;
    }else *e=‘#‘;
}

void clear(PSTACK *s){
    PSTACK p;
    while((*s)->next){
        p=*s;
        *s=(*s)->next;
        free(p);
        p=NULL;
    }
}

void destroy(PSTACK *s){
    free(*s);
    *s=NULL;
}

注:改善操作数的限制可使用整形(或浮点型)数组存放中间变量。

逆波兰表达式的C实现,布布扣,bubuko.com

时间: 2024-12-26 09:03:08

逆波兰表达式的C实现的相关文章

逆波兰表达式

1696:逆波兰表达式 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4.本题求解逆波兰表达式的值,其中运算符包括+ - * /四个. 输入 输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数. 输出 输出为一行,表达式的值.可直接用prin

lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值

题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"]

求解逆波兰表达式的值

题目: Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, *, /. Each operand may be an integer or another expression. Some examples:   ["2", "1", "+", "3", "*"

[Leetcode] evaluate reverse polish notation 计算逆波兰表达式

Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are+,-,*,/. Each operand may be an integer or another expression. Some examples: ["2", "1", "+", "3", "*"] -> (

栈的操作实现逆波兰表达式的计算

代码如下: #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10 #define MAXBUFFER 10 typedef double ElemType; typedef struct { ElemType *base; ElemType *top; int StackSize; }sqStack; v

C++实现 逆波兰表达式计算问题

C++实现 逆波兰表达式计算问题 #include <iostream> #include <string> using namespace std; class Stack { private: int size; int top; float *listArray; public: Stack(int sz=20); ~Stack(); bool push(float it);//入栈 bool pop(float& it);//出栈 bool isEmpty();//

续前篇-关于逆波兰表达式的计算

相对于逆波兰表达式的转换,逆波兰表达的计算可谓简单不少. 具体计算方法参考:http://www.cnblogs.com/vpoet/p/4659546.html 这里也大致梳理一下: 1.新建一个栈将逆波兰表达式的数字依次压入栈中 2.当遇到运算符时,出栈两个数同时将运算结果压栈 3.重复步骤2直到计算计算,栈中的元素即为逆波兰表达式的计算结果. 实现如下: 1 #include <iostream> 2 #include <stack> 3 using namespace st

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

前/中/后缀表达式的转换 自然表达式转换为前/中/后缀表达式,其实是很简单的.首先将自然表达式按照优先级顺序,构造出与表达式相对应的二叉树,然后对二叉树进行前/中/后缀遍历,即得到前/中/后缀表达式. 举例说明将自然表达式转换成二叉树: a×(b+c)-d ① 根据表达式的优先级顺序,首先计算(b+c),形成二叉树 ②然后是a×(b+c),在写时注意左右的位置关系 ③最后在右边加上 -d 然后最这个构造好的二叉树进行遍历,三种遍历的顺序分别是这样的: ① 前序遍历:根-左-右 ② 中序遍历:左-

逆波兰表达式计算

逆波兰表达式又叫做后缀表达式.在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示. #include<iostream> #include<assert.h> using namespace std; class Stack { public:  Stack()   :_array(NULL)   , _size(0)   , _capacity(0)  {}  Stack(const Stack<T>& s)   :_ar