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

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. 用node编写自己的cli工具

    工作中接到新项目,开发前都需要先规划项目目录,然后一个个创建文件,搭建sass编译环境,下载jquery,Swiper等类库... 这些准备工作都要花上不少时间.每做一个项目,都会遇到同样的问题,再重 ...

  2. 把ipad作为电脑的第二显示器

    需要:1,iPad          2,ios端需要软件idisplay(在pp助手里搜索idisplay下载即可)       3,windows需要软件iDisplay(链接http://www ...

  3. Hibernate SQLQuery 原生SQL 查询及返回结果集处理-2

    1. 返回List, .setResultTransformer(      Transformers.ALIAS_TO_ENTITY_MAP);将结果转为Map,存放到list中,即list中为若干 ...

  4. 笔记本shift变粘贴,粘滞键设置已关闭

    之前手贱吧,拿湿抹布擦了擦笔记本电脑的自带键盘,然后部分按键失灵了. 本想着反正也都是在寝室用的,趁机找借口买了个机械键盘,啪啪啪... 刚开始好好的,后来发现一按shift就会粘贴,百度了下都说是粘 ...

  5. 两种最常用的Sticky footer布局方式

    Sticky footer布局是什么? 我们所见到的大部分网站页面,都会把一个页面分为头部区块.内容区块和页脚区块,当头部区块和内容区块内容较少时,页脚能固定在屏幕的底部,而非随着文档流排布.当页面内 ...

  6. Java文件流应用:剪切文件

    剪切的实际操作是: 第一步,先复制文件到指定位置, 第二步,删除原文件,这样就实现了剪切 与复制文件相比,多了一步删除文件 注意:删除文件必须在流关闭后,才能删除,否则,删除不了. 实例代码 pack ...

  7. js背景自适应,学到了

    最近在做一个项目,要求实现背景自适应,何为背景自适应呢? 1.如果背景图高度不够,背景height是100%,background-size就应该是 100% auto 2.如果背景图宽度不够,背景w ...

  8. html打造动画【系列1】- 萌萌的大白

    每个人心中都有一个暖暖的大白,blingbling的大眼睛~软软的肚子~宽厚的肩膀~善良的心肠~如果可以,我愿意沦陷在大白的肚子里永远不出来,哈哈~毛球要失宠咯~ 哈哈哈 每个人都是独立的个体,大白也 ...

  9. java控件之树形结构JTree

    import javax.swing.JFrame; import javax.swing.JTree; import javax.swing.event.TreeSelectionEvent; im ...

  10. Java(17)异常

    一.异常 1.1程序执行过程中出现的影响程序运行正常运行的现象.  1.2异常语法 try{ //代码块 }catch(异常类型 e){ }catch(异常类型 e){ }...{ }finally{ ...