栈是一种限定仅在表尾进行插入和删除操作的线性表。栈的应用有很多,比如常见的递归,计算机表达式求值等。下面我们用栈来实现简易的四则运算计算器。

列一下本文的思路:

  1. 实现链栈的数据结构及其操作
  2. 中缀表达式转后缀表达式
  3. 后缀表达式求值
1、首先, 先实现一个链栈。
//定义栈的数据结构
class Node
{public $symbol;public $next;public function __construct( $symbol, $next ){$this->symbol = $symbol;$this->next   = $next;}
}//初始化栈,生成头结点
function initStack( &$node )
{$node = new Node( '', null );
}//入栈
function push( Node &$node, $symbol )
{$p          = new Node( $symbol, null );$p->next    = $node->next;$node->next = $p;
}//出栈
function pop( Node &$node, &$symbol )
{if ( null == $node->next ) {echo "栈空\n";return;}$q          = $node->next;$symbol     = $q->symbol;$node->next = $node->next->next;unset( $q );
}
2、其次, 利用第一步实现的链栈,将中缀表达式转为后缀表达式。
//获取运算符的优先级
function get_priority( $symbol )
{switch ( $symbol ) {case '(':$priority = 3;break;case '*':case '/':$priority = 2;break;case '+':case '-':$priority = 1;break;case ')':$priority = 0;break;default:$priority = 0;break;}return $priority;
}//栈顶依次出栈,如果遇到'('则停止
function clear_stack( &$list )
{$res = '';while ( null != $list->next ) {if ( '(' != $list->next->symbol ) {pop( $list, $item );$res .= $item;} else {pop( $list, $item );return $res;}}return $res;
}//中缀表达式转后缀表达式
function middle_to_back( $middle_expression )
{initStack( $list );$back_expression = '';$length          = strlen( $middle_expression );for ( $i = 0; $i < $length; $i ++ ) {$symbol = $middle_expression[ $i ];if ( ' ' != $symbol ) {if ( is_numeric( $symbol ) ) { //数字直接输出$back_expression .= $symbol;} else {//非数字则比较优先级$stack_top_priority      = get_priority( null == $list->next ? '' : $list->next->symbol );$current_symbol_priority = get_priority( $symbol );if ( $current_symbol_priority > $stack_top_priority ) {//优先级比栈顶高则进栈push( $list, $symbol );} else {$output          = clear_stack( $list );$back_expression .= $output;if ( ')' != $symbol ) {push( $list, $symbol );}}}}}while ( null != $list->next ) {//将栈清空pop( $list, $item );$back_expression .= $item;}return $back_expression;
}
3、接下来, 我们利用第一步实现的链栈,和第二步得到的后缀表达式,计算最后的值。
//是否是四则运算符号
function is_arithmetic_symbol( $symbol )
{$arithmetic_symbols = array( '+', '-', '*', '/' );if ( in_array( $symbol, $arithmetic_symbols ) ) {return true;} else {return false;}
}//计算后缀表达式的值
function calculate( $expression )
{$stack  = new Node( '', null );$length = strlen( $expression );for ( $i = 0; $i < $length; $i ++ ) {if ( ' ' != $expression[ $i ] ) {//为空则跳过if ( is_numeric( $expression[ $i ] ) ) {push( $stack, $expression[ $i ] );} else if ( is_arithmetic_symbol( $expression[ $i ] ) ) {pop( $stack, $n1 );pop( $stack, $n2 );$res = get_result( $n2, $n1, $expression[ $i ] );push( $stack, $res );} else {echo "wrong symbol, exit";exit();}}}$value = $stack->next->symbol;return $value;
}
最后,我们测试一下所实现的计算器。
function main()
{$back_expression = middle_to_back( '((1+2)*3-4) * 5' );$result          = calculate( $back_expression );echo "后缀表达式的值为: " . $back_expression, PHP_EOL;echo "result : " . $result, PHP_EOL;
}main();

得到的结果如下:

简易的计算器就实现啦!~~~
(代码中有一些细节未做判断,希望读者理解。欢迎大家提出批评修改意见,感谢~)

用链栈实现简易四则运算计算器(php版)相关推荐

  1. 简易四则运算计算器(C51单片机实现)

    [说明] 这是嵌入式课程的一个小作业,用C51单片机,实现了0-255内的简易四则运算,暂不支持负数.溢出等特殊情况的处理. [关键点] 1.计算器用R5.R6.R7三位显示,段码为0,全暗,段码为0 ...

  2. python写四则运算器_python 简易四则运算计算器

    import re s_input="1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4* ...

  3. 简易统计计算器——C++版

    用C++是挺方便的- -! #include <iostream> #include <algorithm> #include <vector> using nam ...

  4. c语言计算器程序代码 链栈,【C语言】简易科学计算器源代码(链栈应用)(原创).doc...

    [C语言]简易科学计算器源代码(链栈应用)(原创) 用到的是算符优先法的思想,现摘自严蔚敏的数据结构(C语言版)的3.2.5章来详细说明算符优先法的思想: (摘抄结束) 我给出的计算器功能有:支持欧拉 ...

  5. 数据结构:栈实现简易计算器

    文章目录 栈实现简易计算器 思路 代码实现 栈结构 运算方法 测试 栈实现简易计算器 之前的博客已经介绍了栈数据结构,栈有着数据先进后出的特点,因此用于实现简易计算器时相当方便.本博文中将介绍如何用栈 ...

  6. 数据结构与算法(3-1)栈(顺序栈、两栈共享空间、链栈、栈的计算器)

    目录 一.顺序栈 存储结构 总代码 二.两栈共享空间 存储结构: 总代码: 三.链栈 存储结构: 总代码: 一.顺序栈 存储结构: 栈特点:先进后出,后进先出.(特殊的线性表) 入栈时在栈顶添加元素, ...

  7. 【练习】c++用链栈实现计算器

    栈有顺序栈和链栈,其中顺序栈相当于用数组表示,而链栈则用链表,在表现方式上用链栈当然更加复杂. 首先对于一个链栈,自己重写类,需要写的基本的函数:构造函数,析构函数,入栈操作,出栈操作,取栈头,判断栈 ...

  8. c语言求不定式的最大值,C语言之四则运算表达式求值(链栈)—支持浮点型数据,负数, 整型数据运算...

    运算符间的优先级关系: 链栈结构体定义: 数据域使用字符串长度为20的字符数组(故需要注意判断读取的字符串是运算符还是数值) 可支持浮点型数据,负数, 整型数据的运算 float EvaluateEx ...

  9. (C语言)栈应用简易计算器实现

    //利用栈实现简易计算器,进行包含+,-,*,/,(,)间的计算 #include<stdio.h> #include<string.h> #define MaxSize 10 ...

最新文章

  1. python映射类型-Python中字典映射类型的学习教程
  2. 【数字信号处理】相关函数应用 ( 相关函数应用场景 | 噪声中检测信号原理 )
  3. Intellij IDEA下一个Tomcat启动带多个虚拟目录和JDNI数据源应用的方法
  4. Gym-100676E Time Limit Exceeded?
  5. HDU - 3804 Query on a tree(树链剖分+线段树+离线处理)
  6. BZOJ 3527: [ZJOI2014]力(FFT)
  7. python获取目录树_Python读取文件目录树——os.walk
  8. hbase本地调试环境搭建
  9. 汇编语言---函数调用栈
  10. 10.11 noip模拟试题
  11. 【word毕业论文排版(1)】尾注的删除
  12. Snipe-IT部署方案
  13. npm修改全局安装默认路径(C:\Users\Administrator\AppData\Roaming\npm\node_modules)
  14. matlab 如何统计矩阵中大于、小于或等于某一值的位置、个数
  15. 离散数学 08.02 格的定义
  16. Android应用开发获取手机电池电量的简单方法
  17. 线性回归中的假设检验
  18. java oval_Java开源可扩展数据验证框架之OVAL
  19. RADIUS协议 [收藏]
  20. SpringBoot邮件发送(QQ邮箱)

热门文章

  1. 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一第1章 C语言与内存1.1 引言...
  2. Android开发之dp转像素,像素转换为dp工具类,详细代码,带有源文件下载地址。...
  3. Oracle中TO_DATE格式
  4. 长短视频之争,长视频平台和短视频源码谁主沉浮?
  5. 干货 | VMAF视频质量评估在视频云转码中的应用
  6. NeHe OpenGL教程 第十课:3D世界
  7. Mongodb数据库的基本操作
  8. 作为一个程序员为什么要写博客?
  9. Reactor实例解析
  10. linux小知识之硬盘健康状态检测