逆波兰表达式的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 ...
随机推荐
- Plupload上传插件自定义图片的修改
若自定义的一个上传图片效果,代码(可能不全),当用户再次点击所有或任意一个上传图片的input时,uploader.files已经多了客户再次上传的图片,但是你就想要最后的两张图片,这就可以使用到up ...
- C#打开php链接传参然后接收返回值
php代码 一.php <?php header("Content-Type:text/html;charset=UTF-8"); $u=$_POST['zdupdate'] ...
- Linux与mv命令结合,移动文件至指定目录
转自:http://blog.csdn.net/hardwin/article/details/7711635 把当前目录下面的file(不包括目录),移动到/opt/shell find . - ...
- click和blur事件冲突解决方案
场景:例如做一个模仿百度搜索的搜索框,输入文字下面会有匹配项,当点击下拉项中的值时,就将值添加到搜索框中同时隐藏下拉框,点击其他地方就直接隐藏下拉框,这时所需要的事件分别为 下拉框事件onclick, ...
- ionic 使用mobisscrolls,实现日期选择的插件
废话不多说,直接说用法: 1,先下载mobisscrolls的破解版,下载地址,链接:http://pan.baidu.com/s/1boSKf51 密码:5dft 当然你也可以去官网下载,不过官网的 ...
- "php-cgi.exe - FastCGI 进程意外退出" 解决办法
问题描述: win7下iis中php-cgi.exe - FastCGI 进程意外退出 错误提示: HTTP 错误 500.0 - Internal Server Error D:\phpStudy\ ...
- 织梦DedeCMS调用二级子栏目或者多级栏目的方法
图2 当前栏目typeid值为3,所以代码如下: {dede:channelartlist typeid='3,3'} <a href="{dede:field name='typeu ...
- angular多页面切换传递参数
<!DOCTYPE html> <html lang="en" ng-app="myapp"> <head> <met ...
- 友盟分享到微信 监听不执行 监听只执行onStart,(onResult,onError,onCancel 不执行)
最近在做一个项目 有一个需求是要分享项目中的一个商品 这对于我来说简直是 so easy (项目是三个人一起写的) 正好看到之前有同事写完了 我就拿过来用吧 一顿复制粘贴 大功告成 这个是监 ...
- 获取当前 系统时间 + 获取当前URL 键值;
一://系统当前时间 function show(){ var mydate = new Date(); var str = "" + mydate.getFullYear() + ...