//碰到数字直接输出
//运算符号:与栈顶符号进行优先级比较//若栈顶符号优先级比运算符号优先级低:此符号进栈(括号优先级最低)//若栈顶符号优先级不低于运算符号优先级:将栈顶符号一直弹出并输出,直到不满足条件之后进栈
//左括号:直接进栈
//右括号:将栈顶符号弹出并输出,直到匹配左括号
//最后将所有元素弹出并输出
#define _CRT_SECURE_NO_WARNINGS
#include"LinkList.c"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>typedef struct MYCHAR {LinkNode node;char* p;
}MyChar;int IsNumber(char c)
{return c >= '0' && c <= '9';
}int IsLeft(char c)
{return c == '(';
}int IsRight(char c)
{return c == ')';
}//判断是不是运算符号
int IsOperator(char c)
{return c == '+' || c == '-' || c == '*' || c == '/';
}void NumberOpeartor(char* p)
{printf("%c", *p);
}//创建Mychar
MyChar* CreateMyChar(char *p)
{MyChar* mychar = (MyChar *)malloc(sizeof(MyChar));mychar->p = p;return mychar;
}//左括号的操作
void LeftOperator(LinkList* stack, char *p)
{Push_LinkList(stack, (LinkNode*)CreateMyChar(p));
}//右括号操作
void RightOperator(LinkList* stack)
{//先判断栈中有没有元素while (Size_LinkList(stack) > 0){MyChar* mychar = (MyChar*)Top_LinkList(stack);//如果匹配到左括号if (IsLeft(*(mychar->p))){Pop_LinkList(stack);break;}//输出printf("%c", *(mychar->p));//弹出Pop_LinkList(stack);//释放内存free(mychar);}
}//返回运算优先级
int GetPriority(char c)
{if (c == '*' || c == '/'){return 2;}if (c == '+' || c == '-'){return 1;}return 0;
}//运算符号的操作
void OperatorOperate(LinkList* stack, char *p)
{//先取出栈顶元素MyChar* mychar = (MyChar*)Top_LinkList(stack);if (mychar == NULL){Push_LinkList(stack, (LinkNode*)CreateMyChar(p));return;}//如果栈顶优先级低于当前字符优先级 直接入栈if (GetPriority(*(mychar->p)) < GetPriority(*p)){Push_LinkList(stack, (LinkNode*)CreateMyChar(p));return;}//如果栈顶符号优先级不低于当前字符优先级else {//while (Size_LinkList(stack) > 0)//{//    MyChar* mychar2 = (MyChar*)Top_LinkList(stack);//  //如果优先级低,当前符号入栈//    if (GetPriority(*(mychar2->p)) < GetPriority(*p))//   {//     Push_LinkList(stack, (LinkNode*)CreateMyChar(p));//     break;//    }// printf("%c", *(mychar2->p));// //弹出//  Pop_LinkList(stack);//  //释放//  free(mychar2);  //}//将第一个获取的元素输出并弹出printf("%c", *(mychar->p));Pop_LinkList(stack);//一直比较直到满足条件while (Size_LinkList(stack) > 0){MyChar* mychar2 = (MyChar*)Top_LinkList(stack);//如果优先级低,当前符号入栈if (GetPriority(*(mychar2->p)) < GetPriority(*p)){Push_LinkList(stack, (LinkNode*)CreateMyChar(p));break;}printf("%c", *(mychar2->p));//弹出Pop_LinkList(stack);//释放free(mychar2);    }//弹出完毕后最后将符号元素压入Push_LinkList(stack, (LinkNode*)CreateMyChar(p));}}
int main()
{char* str = "8+(3-1)*5+1-6";char* p = str;LinkList* stack = Init_linkList();while (*p != '\0'){//如果是数字,直接输出if (IsNumber(*p)){NumberOpeartor(p);}//如果是左括号,进栈if (IsLeft(*p)){LeftOperator(stack, p);}//如果是右括号,从栈顶弹出元素,直到匹配到左括号if (IsRight(*p)){RightOperator(stack);   }//如果是运算符号if (IsOperator(*p)){OperatorOperate(stack, p);}p++;}while (Size_LinkList(stack) > 0){MyChar* mychar = (MyChar*)Top_LinkList(stack);printf("%c", *(mychar->p));Pop_LinkList(stack);free(mychar);}system("pause");return 0;
}

数据结构-栈4-栈的应用-中缀转后缀相关推荐

  1. 数据结构实验报告(二)简单计算器(中缀转后缀)

    报告汇总之c语言数据结构报告篇(二) 简单计算器 代码区 #include <stdio.h> #include <stdlib.h>char S[100]; char S2[ ...

  2. 数据结构——堆栈——计算器的原理(中缀变后缀)

    定义:栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅在表尾进行插入和删除操作的线性表.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放到 ...

  3. 顺序栈计算器 中缀转后缀表达式

    顺序栈计算器 中缀转后缀表达式 前言 一.后缀表达式简述 二.参考书目中的函数实现 1.输入一个后缀表达式并计算 2.将中缀转后缀表达式 三.在原方法基础上改写并结合两个方法 1.输入一个后缀表达式并 ...

  4. 数据结构复习之栈和队列(正在整理中...)感谢天勤考研..

    栈(先进后出) 一.逻辑结构 栈到底是什么? 栈是一种只能在一端进行插入或删除操作的线性表. 二.存储结构 顺序栈 ++top 的意思是 先让top 自增1 top-- 先取top的值 再减1 注意一 ...

  5. C语言实现中缀转后缀并计算表达式结果

    文章目录 一.问题描述 二.AC代码 三.注意点 四.实现思路/代码解析 一.问题描述 [问题描述] 从标准输入中读入一个整数算术运算表达式,如5 - 1 * 2 * 3 + 12 / 2 / 2   ...

  6. (王道408考研数据结构)第三章栈和队列-第三节1:栈的应用之括号匹配问题和表达式问题(前缀、中缀和后缀)

    前面我们就说过,栈是一种先进后出的线性表,这种先进后出的特性就决定了它在一类场合或问题中会经常被用到--递归.考研数据结构中所涉及的利用栈结构解决递归问题或者考察栈结构特性的问题主要有这么几类 括号匹 ...

  7. 数据结构:用栈实现表达式的转换(文字描述+详细步骤示例)——中缀转后缀

    中缀转后缀 从左到右扫描这个中缀表达式,如果遇到操作数,就直接写出来:如果遇到运算符,就将其入栈. 入栈之前,首先将当前运算符与栈顶运算符比较优先级,如果当前运算符优先级小于等于栈顶运算符的优先级,则 ...

  8. 数据结构之栈实现中缀转后缀并计算结果

    一.中缀变后缀过程分析 给定一个中缀,最后变为后缀的过程其实并不算复杂,下面分析一下过程: 1. 首先面对一个中缀表达式,我们需要两个栈,一个用来存放运算符,即符号栈 operatorstack,一个 ...

  9. 数据结构 - 栈 (逆波兰计算器)(栈的三种表达式)(前缀、中缀和后缀表达式,后缀也叫逆波兰表达式)(中缀表达式转后缀表达式实现步骤及完整代码)

    栈的三种表达式:前缀.中缀和后缀表达式,后缀也叫逆波兰表达式 前缀(波兰表达式) 中缀(对人来讲很好理解,对于计算机来讲就方便了,一般会把中缀表达式转换成后缀表达式) 后缀(逆波兰表达式) 计算过程 ...

  10. 数据结构(3) 第三天 栈的应用:就近匹配/中缀表达式转后缀表达式 、树/二叉树的概念、二叉树的递归与非递归遍历(DLR LDR LRD)、递归求叶子节点数目/二叉树高度/二叉树拷贝和释放...

    01 上节课回顾 受限的线性表 栈和队列的链式存储其实就是链表 但是不能任意操作 所以叫受限的线性表 02 栈的应用_就近匹配 案例1就近匹配: #include <stdio.h> in ...

最新文章

  1. [转载]iptables 详细教程
  2. 【eoe教程】Android中自定义视图的绘制方法
  3. 非此即彼的逻辑错误_MBA逻辑攻略-逻辑知识大全,快来收藏吧!
  4. Windows上使用Git管理文件
  5. 年轻人原地过年,也不忘搞钱
  6. mysql log error_MySQL日志之error_log
  7. 购房者一次性付清和还贷三十年,差别有多大?
  8. java for语句
  9. 获取别人_职场潜规则:要想获取别人信任与更多机会,先要学会勇于承担责任...
  10. 《统计学》第八版贾俊平第十一章一元线性回归知识点总结及课后习题答案
  11. 三点运算符(三点语法)
  12. rsyslogd(开机或大量消息)消息丢失速率限制[internal_messages]: 569 messages lost due to rate-limiting
  13. 探索Google App Engine背后的奥秘(1)--Google的核心技术(转帖)
  14. 玩转全志F1C200s 烧录 flash 镜像
  15. 从柯布-道格拉斯生产函数看云计算对传统软件工程的影响
  16. java使用cxf调用https方式的webservice
  17. 川崎机器人与1200PLCTCP通信实例分享
  18. 最新综述:视频数据的无监督域适应
  19. 许愿墙 – javaee 项目实战(一)
  20. Excel中的智能模糊查询下拉菜单,比下拉列表强20倍

热门文章

  1. Java基础篇3——流程控制
  2. mysql区间段_解决针对MySQL中对于某一个区间段范围的数据更新的情况
  3. haproxy keepalived_Haproxy+KeepAlived+Mycat实现高可用集群
  4. coreos 安装mysql_如何执行CoreOS Linux的裸机安装
  5. coffeescript html5,HTML5——前端预处理技术(Less、Sass、CoffeeScript)
  6. android自定义进度条百分比跟着走,Android自定义View实现水平带数字百分比进度条...
  7. word2vec应用场景_介绍Word2Vec和Glove这两种最流行的词嵌入方法背后的直觉
  8. 2018.9.19.Matlab实验四:Matlab程序设计
  9. (找循环节)Number Sequence
  10. 用java画海绵宝宝_java 方法的重载