栈的应用---(中缀表达式 转 后缀表达式)
来源:互联网 发布:高中数学矩阵知识点 编辑:程序博客网 时间:2024/05/16 17:48
中缀表达式、后缀表达式,都是用来呈现运算表达式的一种方式。
标准表达式:4+5+(6*7)
中缀表达式,就是标准的表达式,即4+5+(6*7)
后缀表达式,符号在后的表达式,即4 5 + 6 7 *
中缀表达式 转 后缀表达式 的思想是(注意的是:只有( + - * / 这5种符号才会入栈)
1. 读到操作数时,立即输出
2. 读到的是操作符,分以下情况处理
+ 如果是 (,入栈
+ 如果是 ),弹出栈中符号,直到弹出的是 (
+ 如果是 + 或 - ,依次弹出栈中所有符号(直到栈顶是(,弹出结束),最后将+ 或 -入栈
+ 如果是 * 或 /,依次弹出栈中所有符号(直到栈顶是* 或者 /,弹出结束),最后将+ 或 -入栈
3. 如果读到结尾,栈还是不为空,则依次弹出栈中所有符号
4. 步骤2和3中所有的弹出操作,除了 ( ,都要输出显示,最后输出的结果就是后缀表达式
代码实现如下
(下面的代码有调用到一个API(profix_expression_in),这个API是跟根据后缀表达式来计算表达式的结果,详见栈的应用—(后缀表达式),另外栈的基本实现,详见栈的实现(链表方式))
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stdbool.h>#include "stack.h"bool infix_to_profix_is_number(char str){ if(str>='0' && str<='9') return true; else return false;}void infix_to_profix_is_symbol(STACK * inputStack, STACK * outputStack, char str){ char value = 0; if('(' == str) { stack_push(inputStack, str); } else if(')' == str) { while((true != stack_is_empty(inputStack)) && ('(' != stack_top(inputStack)) ) { value = stack_pop(inputStack); printf("%c ", value); profix_expression_in(outputStack, &value); } stack_pop(inputStack); // pop ')' } else if('+'==str || '-'==str) { // pop the low or the same priority string in the Stack while((true != stack_is_empty(inputStack)) && ('(' != stack_top(inputStack))) { value = stack_pop(inputStack); printf("%c ", value); profix_expression_in(outputStack, &value); } stack_push(inputStack, str); } else if('*'==str || '/'==str) { // pop the low or the same priority string in the Stack while((true != stack_is_empty(inputStack)) && ('*'==stack_top(inputStack) || '/'==stack_top(inputStack))) { value = stack_pop(inputStack); printf("%c ", value); profix_expression_in(outputStack, &value); } stack_push(inputStack, str); }}void infix_to_profix_read(STACK * inputStack, STACK * outputStack, char * str){ char *p = str; int value = 0; while(*p != '\0') { if(' ' != *p) { if(true == infix_to_profix_is_number(*p)) { printf("%c ", *p); profix_expression_in(outputStack, p); } else { infix_to_profix_is_symbol(inputStack, outputStack, *p); } } p = p + 1; } while(true != stack_is_empty(inputStack)) { value = stack_pop(inputStack); printf("%c ", value); profix_expression_in(outputStack, &value); }}void infix_to_profix_main_test(void){// char string[] = "1 + ( 2 - 1 ) * 3"; // profix (1 2 1 - 3 * +), result (4)// char string[] = "1 + ( ( 2 + 3 ) * 4 ) - 5"; // profix (1 2 3 + 4 * + 5 -), result (16) char string[] = "5 + ( 2 + 3 ) * 4 / 5"; // profix (5 2 3 + 4 * 5 / -), result (9)// char string[] = "4 + 5 + ( 6 * 7 )"; // profix (4 5 + 6 7 * +), result (51) STACK * inputStack = stack_init(); STACK * outputStack = stack_init(); printf("Infix is : %s\n", string); printf("Profix is : "); infix_to_profix_read(inputStack, outputStack, string); printf("\ncalculate result = %d\n", stack_pop(outputStack));}
输出效果如下
0 0
- 中缀表达式转后缀表达式求值(栈的应用)
- 栈的应用---(中缀表达式 转 后缀表达式)
- 栈应用(中缀表达式转后缀表达式并计算后缀表达式的值)
- 栈的应用-中缀表达式转后缀表达式(C版)
- 栈的应用实践之中缀表达式转后缀表达式
- 栈的应用 - 中缀表达式转后缀表达式
- 栈的应用之中缀表达式转后缀表达式
- 栈的应用案例2:中缀表达式转后缀表达式
- 《数据结构实战》中缀表达式转后缀表达式----栈的应用
- 中缀表达式转化为后缀表达式(栈的应用)
- 中缀表达式转后缀表达式 (中缀表达式的计算)
- 栈的应用——中缀表达式转后缀表达式,后缀表达式的求值,中缀表达式求值
- 栈的应用(一)——中缀表达式转后缀表达式
- 栈的应用—中缀转后缀求表达式值
- 栈的应用--表达式计算&中缀转后缀
- 栈的重要应用之中缀转后缀表达式算法
- 栈的应用之中缀表达式转后缀
- 栈的应用--算术表达式的求值(中缀转后缀然后计算后缀表达式的值)
- 实现一个bubble_sort函数,可以完成int ,float,char,string类型的排序
- 设计模式之工厂模式
- 技术帮助文档
- 删除服务器 默认的apache2服务
- Linux局域网集群软件的安装(以JDK安装为例)
- 栈的应用---(中缀表达式 转 后缀表达式)
- 使用动态宏动态控制数据集的表名
- Mac安装MySQL
- Kafka学习笔记(三)
- typedef与#define的区别
- matlab中使用fopen时出错解决办法
- xml
- 【BZOJ】4723 [POI2017] Flappy Bird
- python练习 序