逆波兰表达式的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 ;
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实现的更多相关文章
- [LeetCode] Evaluate Reverse Polish Notation 计算逆波兰表达式
Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...
- AC日记——逆波兰表达式 openjudge 3.3 1696
1696:逆波兰表达式 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式 ...
- noi1696 逆波兰表达式
1696:逆波兰表达式 http://noi.openjudge.cn/ch0303/1696/ 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算符前置的算术 ...
- codevs5164 逆波兰表达式
题目描述 Description 逆波兰表达式是一种把运算符前置的算术表达式(又叫前缀表达式),例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也 ...
- lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值
题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1&q ...
- SDIBT2666——逆波兰表达式求值
逆波兰表达式求值(栈和队列) Description 从键盘上输入一个逆波兰表达式,用伪码写出其求值程序.规定:逆波兰表达式的长度不超过一行,以@符作为输入结束,操作数之间用空格分隔,操作符只可能有+ ...
- OpenJudge 2694 逆波兰表达式
1.链接地址: http://bailian.openjudge.cn/practice/2694/ 2.题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算 ...
- 逆波兰表达式 java
描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系, 也不必用括号改变运算次序,例如(2 + 3) ...
- c++实现将表达式转换为逆波兰表达式
https://github.com/Lanying0/lintcode 所属: 数据结构->线性结构->栈 问题: 给定一个表达式字符串数组,返回该表达式的逆波兰表达式(即去掉括号). ...
- CH BR4思考熊(恒等有理式-逆波兰表达式求值)
恒等有理式 总时限 10s 内存限制 256MB 出题人 fotile96 提交情况 4/43 描述 给定两个有理式f(X)与g(X),判断他们是否恒等(任意A,如果f(A)与g(A)均有定义,那么f ...
随机推荐
- Lambda应用场景和使用实例
Java 8已经推出一段时间了,Lambda是其中最火的主题,不仅仅是因为语法的改变,更重要的是带来了函数式编程的思想.这篇文章主要聊聊Lambda的应用场景及其相关使用示例. Java为何需要Lam ...
- R + ggplot2 Graph Catalog(转)
Joanna Zhao’s and Jenny Bryan’s R graph catalog is meant to be a complement to the physical book,Cre ...
- OVS + dpdk 安装与实验环境配置
***DPDK datapath的OVS的安装与实验环境配置 首先肯定是DPDK的安装 0:安装必要的工具 make gcc ...
- JavaSE教程-01初识Java-思维导图
图片看不清楚时: 1)可以将图片另存为图片,保存在本地来查看 2)右击在新标签中打开放大查看. 分解: 1.计算机基本概念的普及 硬件 cpu.内存.硬盘等 软件 系统级软件 Windows.Linu ...
- 在.NET Core中使用Irony实现自己的查询语言语法解析器
在之前<在ASP.NET Core中使用Apworks快速开发数据服务>一文的评论部分,.NET大神张善友为我提了个建议,可以使用Compile As a Service的Roslyn为语 ...
- js编写简单的贪吃蛇游戏
css代码 *{ margin:; padding:; } td{ width: 4px; height: 4px; background: #ccc; border: 2px solid #ccc; ...
- [附录]Discuz X2.5 模板目录结构注释说明
/template/default/common 公共模板目录全局加载 block_forumtree.htm DIY论坛树形列表模块 block_thread.htm DIY帖子模块调用文件 ...
- linq中给字段添加别名
linq 是我们在查询中经常回用到的一种形式,比如我们创建一个类,然后List<添加> 并绑定到表格中 public class Modeltest { string id; public ...
- 【原创】源码角度分析Android的消息机制系列(三)——ThreadLocal的工作原理
ι 版权声明:本文为博主原创文章,未经博主允许不得转载. 先看Android源码(API24)中对ThreadLocal的定义: public class ThreadLocal<T> 即 ...
- [0] MVC&MVP&MVVM差异点
MVC: 用户的请求首先会到达Controller,由Controller从Model获取数据,选择合适的View,把处理结果呈现到View上: MVP: 用户的请求首先会到达View,View传递请 ...