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

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 ;
if(op=='*' || op=='/')
return ;
return ;
} char calc(char *rpn){
char *p=rpn;
char e;
int x, y;
PSTACK pStack;
init(&pStack);
while(*p){
if(<=*p && *p<=){
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[]="";
char *p=old_exp;
char *r=rpn_exp;
PSTACK gStack;
init(&gStack);
//
while(*p!='\0' && *p!='='){
if(''<=*p && *p<=''){
*r++=(*p-'');
}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 ;
} 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实现的更多相关文章

  1. [LeetCode] Evaluate Reverse Polish Notation 计算逆波兰表达式

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...

  2. AC日记——逆波兰表达式 openjudge 3.3 1696

    1696:逆波兰表达式 总时间限制:  1000ms 内存限制:  65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式 ...

  3. noi1696 逆波兰表达式

    1696:逆波兰表达式 http://noi.openjudge.cn/ch0303/1696/ 总时间限制:  1000ms 内存限制:  65536kB 描述 逆波兰表达式是一种把运算符前置的算术 ...

  4. codevs5164 逆波兰表达式

    题目描述 Description 逆波兰表达式是一种把运算符前置的算术表达式(又叫前缀表达式),例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也 ...

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

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

  6. SDIBT2666——逆波兰表达式求值

    逆波兰表达式求值(栈和队列) Description 从键盘上输入一个逆波兰表达式,用伪码写出其求值程序.规定:逆波兰表达式的长度不超过一行,以@符作为输入结束,操作数之间用空格分隔,操作符只可能有+ ...

  7. OpenJudge 2694 逆波兰表达式

    1.链接地址: http://bailian.openjudge.cn/practice/2694/ 2.题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算 ...

  8. 逆波兰表达式 java

    描述  逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系, 也不必用括号改变运算次序,例如(2 + 3) ...

  9. c++实现将表达式转换为逆波兰表达式

    https://github.com/Lanying0/lintcode 所属: 数据结构->线性结构->栈 问题: 给定一个表达式字符串数组,返回该表达式的逆波兰表达式(即去掉括号). ...

  10. CH BR4思考熊(恒等有理式-逆波兰表达式求值)

    恒等有理式 总时限 10s 内存限制 256MB 出题人 fotile96 提交情况 4/43 描述 给定两个有理式f(X)与g(X),判断他们是否恒等(任意A,如果f(A)与g(A)均有定义,那么f ...

随机推荐

  1. ZigZag Conversion2015年6月23日

    题目: The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows l ...

  2. Microsoft Azure IoTHub Serials 1 - 使用Android设备与Azure IoTHub进行交互

    Azure IoTHub的目标是为物联网的应用场景提供方便的设备接入,完成消息的发送和接收(C2D和D2C).经过持续不断的努力,目前Azure IoTHub已经支持多种操作系统设备的接入,包括And ...

  3. css因Mime类型不匹配而被忽略,怎么解决

    问题:在火狐.谷歌都可以正常显示出来,在别人的IE浏览器上也可以正常显示出来,但是在自己的ie浏览器就完全不能加载的熬样式了 控制台报告 SEC7113: CSS 因 Mime 类型不匹配而被忽略 答 ...

  4. 1089 Intervals(中文)

    开始前先讲几句废话:这个题我开始也没看懂,后来借助百度翻译,明白了大概是什么意思. 试题描述 输入一个n,然后输入n组数据,每个数据有两个数,代表这个闭区间是从几到几.然后看,如果任意两个闭区间有相重 ...

  5. 一天搞定CSS:盒模型content、padding、border、margin--06

    1.盒模型 网页设计中常听的属性名:内容(content).填充(padding).边框(border).边界(margin), CSS盒子模式都具备这些属性. 这些属性我们可以用日常生活中的常见事物 ...

  6. 提升单元测试体验的利器--Mockito使用总结

    为神马要使用Mockito? 在编写单元测试的时候,为了尽可能的保证隔离性,我们时常需要对某些不容易构造或者不容易获取或者对外部环境有依赖的对象,用一个虚拟的对象来创建以便于测试.假设你正在开发的的代 ...

  7. Selenium基础知识

    本人博客文章网址:https://www.peretang.com/basic-knowledge-of-selenium/ 什么是Selenium Selenium是一个自动化测试工具 是一组不同的 ...

  8. Javascript及Jquery获取元素节点以及添加和删除操作

    用了javascript和jquery很久,把所有元素节点的操作总结了下,放在博客上作为记录. Javascript获取元素的主要方式有三种 1.document.getElementById('ma ...

  9. A comparison of local caches (2) 【本地缓存之比较 (2)】

    接上一篇: A comparison of local caches (1) [本地缓存之比较 (1)] This article will compare the asynchronous loca ...

  10. FastReport.NET 中使用二维码

    FastReport.net 是一个比较好用的报表控件,在编辑器中编辑以后 可以直接在vs 中引用. 最近在研究fastreport 现在讲解一下 如何使用它的二维码. fastreport 没有单独 ...