1.概念

逆波兰式(Reverse Polish notation,RPN,或逆波兰记法),也叫后缀表达式(将运算符写在操作数之后)

实现逆波兰式的算法,难度并不大,但为什么要将看似简单的中序表达式转换为复杂的逆波兰式?原因就在于这个简单是相对人类的思维结构来说的,对计算机而言中序表达式是非常复杂的结构。相对的,逆波兰式在计算机看来却是比较简单易懂的结构。因为计算机普遍采用的内存结构是栈式结构,它执行先进后出的顺序。

新建一个表达式,如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。图示如下:

2.代码

/*
*RPN:Reverse Polish Notation
*逆波兰表达式:将数据存储在栈中进行计算时,入栈时将按照以下顺序
*如:(1-2)*(4+5) RPN是: 1 2 - 4 5 + *
*如: 5 -(6+7)* 8 + 9 / 4  RPN是:  5 6 7 + 8 * - 9 4 /
*/#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>#define STACK_INIT_SIZE 20
#define STACKINCREMENT  10
#define MAXBUFFER       10typedef double ElemType;
typedef struct
{ElemType *base;ElemType *top;int stacksize;
}sqStack;//初始化栈
InitStack(sqStack  *s)
{s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));if (!s->base) exit(0);s->top = s->base;s->stacksize = STACK_INIT_SIZE;
}//入栈操作
Push(sqStack  *s, ElemType e)
{if (s->top - s->base >= s->stacksize){s->base = (ElemType *)malloc((STACK_INIT_SIZE + STACKINCREMENT) * sizeof(ElemType));if (!s->base) exit(0);s->top = s->base + s->stacksize;}*(s->top) = e;s->top++;
}//出栈操作
Pop(sqStack  *s, ElemType *e)
{if (s->top == s->base) return;*e = *--(s->top);
}//获取栈长度
int StackLen(sqStack s)
{return (s.top - s.base);
}int main()
{sqStack s;char c;double d, e;char str[MAXBUFFER];int i = 0;InitStack(&s);printf("Input datas with Reverse Polish Notation,Ending with '#' \n");scanf("%c", &c);while (c != '#'){while (isdigit(c))  //数字与空格的处理{str[i++] = c;str[i] = '\0';if (i >= 10){printf("ERROR:Data is out of range \n");return -1;}scanf("%c", &c);if (c == ' '){d = atof(str);Push(&s, d);i = 0;break; }}switch (c)        //四则运算符号处理{case '+':Pop(&s, &e);Pop(&s, &d);Push(&s, d + e);break;case '-':Pop(&s, &e);Pop(&s, &d);Push(&s, d - e);break;case '*':Pop(&s, &e);Pop(&s, &d);Push(&s, d * e);break;case '/':Pop(&s, &e);Pop(&s, &d);if (e != 0){Push(&s, d / e);}else{printf("ERROR:Input Wrong");return -1;}break;}scanf("%c", &c);}Pop(&s, &d);printf("Result is: %f\n", d);return 0;
}

3.运行结果

5 -(6+7)* 8 + 9 / 4  RPN是:  5 6 7 + 8 * - 9 4 /

线性表_栈_逆波兰计算式(Reverse Polish Notation)相关推荐

  1. Algorithms_基础数据结构(04)_线性表之链表_单向循环链表约瑟夫环问题

    文章目录 大纲图 链表的经典面试题目 如何设计一个LRU缓存淘汰算法 约瑟夫问题 结构 分析 大纲图 链表的经典面试题目 如何设计一个LRU缓存淘汰算法 tip:单向链表 约瑟夫问题 N个人围成一圈, ...

  2. 《大话数据结构》3、4、5线性表、栈与队列、串

    第3章线性表 41 线性表:零个或多个数据元素的有限序列. 3.1开场白 42 门外家长都挤在大门口与门里的小孩子的井然有序,形成了鲜明对比.哎,有时大人的所作所为,其实还不如孩子. 3.2线性表的定 ...

  3. Learning Data Structure_2_线性表、栈和队列

    一个人在学校的日子有些寂寞,但是st说男人要耐得住寂寞,做学问也是如此吧.今天看了线性表.栈和队列的内容.以下是学习记录. 线性表(list) 1.定义:0个或多个数据元素的有限序列,元素有且只有一个 ...

  4. 数据结构:栈实现逆波兰计算器

    栈实现逆波兰计算器 前言 上篇博文中已经介绍了栈实现中缀表达式计算器,中缀表达式形如 "1+((2+3)*4)-5" 对人比较容易计算,但对于计算机却是一件比较困难的事,而后缀表达 ...

  5. Java数据结构(1.1):数据结构入门+线性表、算法时间复杂度与空间复杂度、线性表、顺序表、单双链表实现、Java线性表、栈、队列、Java栈与队列。

    数据结构与算法入门 问题1:为什么要学习数据结构          如果说学习语文的最终目的是写小说的话,那么能不能在识字.组词.造句后就直接写小说了,肯定是不行的, 中间还有一个必经的阶段:就是写作 ...

  6. 数据结构与算法第二章 线性表、栈、队列、数组、字符串、树、二叉树、哈希表的增删查

    03 增删查:掌握数据处理的基本操作,以不变应万变 通过前面课时的学习,相信你已经建立了利用数据结构去完成时空转移的思想.接下来,你需要在理论思想的指导下灵活使用.其实,要想灵活使用数据结构,你需要先 ...

  7. 栈应用-逆波兰表达式(CPP实现简单易懂图解)

    栈应用-逆波兰表达式(后缀表达式) 逆波兰表达式定义: 在由运算符(operator)和操作数(operand)组成的表达式中不使用括号(parenthesis-free)即可表示带优先级的运算关系 ...

  8. Python下基于栈和逆波兰算法实现四则运算

    参考<大话数据结构>一书4.9节,Python下基于栈和逆波兰算法实现四则运算. 栈的实现使用顺序结构,即基于列表实现,参考本人博客Python实现顺序结构栈Sequence Stack ...

  9. Algorithm:C++语言实现之链表相关算法(单链公共结点问题、一般LCA、括号匹配、最长括号匹配、逆波兰表达式Reverse Polish Notation、直方图矩形面积、收集雨水问题)

    Algorithm:C++语言实现之链表相关算法(单链公共结点问题.一般LCA.括号匹配.最长括号匹配.逆波兰表达式Reverse Polish Notation.直方图矩形面积.收集雨水问题) 目录 ...

  10. python线性表和队列_[笔记]python数据结构之线性表:linkedlist链表,stack栈,queue队列...

    python数据结构之线性表 python内置了很多高级数据结构,list,dict,tuple,string,set等,在使用的时候十分舒心.但是,如果从一个初学者的角度利用python学习数据结构 ...

最新文章

  1. matlab一句一句调试,matlab程序怎样调试和运行
  2. LeetCode算法题12:递归和回溯-字符串中的回溯问题
  3. cgi备份还原和ghost有什么区别_装系统教程!如何用ghost安装系统(下)!小白也能变装机大神!...
  4. TCP和Web Socket混合使用的一个例子
  5. 使用Selenium或WebDriver测试GWT应用
  6. HttpURLConnection中connection.getInputStream()报异常FileNotFoundException
  7. 以命令行的方式运行activity
  8. java mp4分割_Android(java方法)上实现mp4的分割和拼接 (二)
  9. 爱奇艺开源轻量级插件化方案 Neptune
  10. creat是什么意思中文翻译_英语create的中文是什么意思
  11. SVN Error: Unreadable path encountered; access denied;
  12. 序列解包(for x,y in zip(keys, values):)详解。
  13. 国际服务贸易重点整理
  14. 序列化(serialization)。
  15. 那些警示良言——老百姓也是圣贤
  16. php页面静态化,ob缓存方法
  17. 什么是Platform SDK?
  18. 跨时钟域信号如何处理(一、单bit信号)
  19. Python实现淘宝秒杀
  20. Windows cmd 命令行清空

热门文章

  1. UDF函数 解码url
  2. 03.搭建Spark集群(CentOS7+Spark2.1.1+Hadoop2.8.0)
  3. 《深入理解计算机系统》读书笔记(ch1)
  4. 05月08日 学习列表
  5. HTML5 canvas图形库 RGraph【转】
  6. 《OD学hadoop》第二周0703
  7. 周记 2015.04.11
  8. 解决Fedora中root无法登录问题
  9. 使用docker安装easy-mock
  10. printf()、sprintf()的二次封装