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

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. JDBC与JNDI的区别

    程序员开发时,知道要开发访问MySQL数据库的应用,于是将一个对 MySQL JDBC 驱动程序类的引用进行了编码,并通过使用适当的 JDBC URL 连接到数据库. 就像以下代码这样: Connec ...

  2. [原创]LAMP+phpmyadmin+FTP环境搭建

    ***简单ftp服务器搭建: rpm –qa|grep vsftpd   //检查是否安装服务 yum –y install vsftpd-*   //安装服务 mkdir /var/ftp/uplo ...

  3. Java-面向对象总结

    下面是学习面向对象的知识点和总结: 面向对象思想: 遇到需求,首先去找是否有现成的类来实现此功能,创建对象来调用,以此来组合成新的类实现自己的需求. 在java中是以类为单位,一个类包括成员变量.成员 ...

  4. 3分钟带你了解PowerShell发展历程——PowerShell各版本资料整理

    本文带你了解PowerShell发展历程,顺便整理了一点资料,方便大家查询. Windows PowerShell® 是基于任务的命令行管理程序和脚本语言,专为进行系统管理而设计. 在 .NET Fr ...

  5. 抽象工厂(AbstractFactory)模式-创建型模式

    1.new 的问题 常见的对象创建方法: //创建一个Road对象 Road road=new Road(); new的问题:实现依赖,不能应对具体实例的变化 怎么理解上面这句话呢? 可以这样理解:我 ...

  6. Unable to find 'struts.multipart.saveDir' property setting.

    今天在项目开发中遇到如下问题 项目使用的是struts2 Unable to find 'struts.multipart.saveDir' property setting. 后来在网上查询特此记录 ...

  7. map,zip,reduce函数

    lt=range(5,10) lw=range(8,13) def mul(a,b): return a*b def mul_list(param1,param2): return_list=[] f ...

  8. Python3实现简单的http server

    前端的开发的html给我们的时候,由于内部有一些ajax请求的.json的数据,需要在一个web server中查看,每次放到http服务器太麻烦.还是直接用python造一个最方便. 最简单的,直接 ...

  9. java基础之IO篇

    IO流 在计算机中的流是有方向的即为IO流,分为输入流和输出流,他们的方向都是以服务的方向为主,向服务器中发送指令等等就是输出流,服务器给出的反应等等,我们都说为输出流. 字节流 字符流 输入流 In ...

  10. springmvc 之 SpringMVC视图解析器

    当我们对SpringMVC控制的资源发起请求时,这些请求都会被SpringMVC的DispatcherServlet处理,接着Spring会分析看哪一个HandlerMapping定义的所有请求映射中 ...