C语言- 基础数据结构和算法 - 09 栈的应用_中缀表达式转后缀表达式20220611
09 栈的应用_中缀表达式转后缀表达式20220611
听黑马程序员教程《基础数据结构和算法 (C版本)》,
照着老师所讲抄的,
视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1
喜欢的朋友可以去看看,欢迎大家一起交流学习。
09 栈的应用_中缀表达式转后缀表达式20220611_main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h> #include "LinkStack.c" typedef struct MYCHAR{
LinkNode* node;
char* pAddres; // 放字符地址,因为每个字符都有一个地址。
int index; // 记录位置
}MyChar; // 判断是否是数字
int IsNumber(char c){
return c >='0' && c <='9';
} // 输出数字
void NumberOperate(char* p){
printf("%c",*p);
} // 判断是否左括号和右括号
int IsLeft(char c){
return c == '(';
}
int IsRight(char c){
return c == ')';
} // 判断是否运算符号
int IsOperator(char c){
return c=='+' || c=='-' || c=='*' || c=='/';
}
// 返回运算符的优先级
int GetPriority(char c){
if(c=='*' || c == '/'){
return 2;
}
if(c=='+'|| c=='-'){
return 1;
}
return 0;
} // 创建MyChar
MyChar* CreateMyChar(char* p){
MyChar* mychar = (MyChar*)malloc(sizeof(MyChar));
mychar->pAddres = p;
return mychar;
} // 左括号进栈
void LeftOperate(LinkStack* stack,char* p){
Push_LinkStack(stack,(LinkNode*)CreateMyChar(p));
} // 右括号操作 弹出并输出,直到匹配左括号
void RightOperate(LinkStack* stack){
// 先判断栈中有没有元素,有则弹,
while(Size_LinkStack(stack)>0){
MyChar* mychar = (MyChar*)Top_LinkStack(stack);
// 如果匹配左括号,则出栈
if(IsLeft(*(mychar->pAddres))){
Pop_LinkStack(stack);
break;
}
// 不匹配左括号,则输出,弹出
printf("%c",*(mychar->pAddres));
Pop_LinkStack(stack);
free(mychar);
}
} // 运算符号的操作
void OperatorOperator(LinkStack* stack,char* p){
// 先取出栈顶符号
MyChar* mychar = (MyChar*)malloc(sizeof(MyChar));
if(mychar==NULL){
Push_LinkStack(stack,(LinkNode*)CreateMyChar(p));
return;
}
// 如果栈顶优先级低于当前字符的优先级,则直接入栈
if(GetPriority(*(mychar->pAddres))< GetPriority(*p)){
Push_LinkStack(stack,(LinkNode*)CreateMyChar(p));
return;
}
// 如果优先级不低,
else{
while(Size_LinkStack(stack) > 0){
MyChar* mychar2 = (MyChar*)malloc(sizeof(MyChar));
// 如果优先级低,当前符号入栈
if(GetPriority(*(mychar2->pAddres))<GetPriority(*p)){
Push_LinkStack(stack,(LinkNode*)CreateMyChar(p));
break;
}
// 输出
printf("%c",*(mychar2->pAddres));
// 弹出
Pop_LinkStack(stack);
// 释放
free(mychar2); } } } int main(){
printf("好好学习,天天向上~!\t\t\t 09_栈的应用_中缀表达式转后缀表达式20220611\n\n\n"); char* str ="8+(3-1)*5";
char* p = str; // 创建栈
LinkStack* stack = Init_LinkStack(); while(*p !='\0'){
// 如果是数字,直接输出
if(IsNumber(*p)){
// 直接输出
NumberOperate(p);
} // 如果是左括号,进栈
if(IsLeft(*p)){
LeftOperate(stack,p);
} // 如果是右括号,则将栈顶符号弹出并输出,直到匹配左括号
if(IsRight(*p)){
RightOperate(stack);
} // 如果是运算符号
if(IsOperator(*p)){
OperatorOperator(stack,p);
} p++;
} while(Size_LinkStack(stack)>0){ MyChar* mychar = (MyChar*)Top_LinkStack(stack);
printf("%c",*(mychar->pAddres));
Pop_LinkStack(stack);
free(mychar); }
// 以上输出结果为 831-5*+
printf("\n\n");
system("pause");
return 0;
}
LinkStack.c
1 #ifndef LINKSTACK_H
2 #define LINKSTACK_H
3
4 #include <stdio.h>
5 #include <stdlib.h>
6
7
8 // 链式栈的节点
9 typedef struct LINKNODE{
10 struct LINKNODE* next;
11 }LinkNode;
12
13 // 链式栈
14
15 typedef struct LINKSTACK{
16 LinkNode HeadNode; //头节点
17 int size;
18 }LinkStack;
19
20 // 初始化
21 LinkStack* Init_LinkStack();
22 // 入栈
23 void Push_LinkStack(LinkStack* stack,LinkNode* data);
24 // 出栈 (删除第一个元素)
25 void Pop_LinkStack(LinkStack* stack);
26 // 返回栈顶元素
27 LinkNode* Top_LinkStack(LinkStack* stack);
28 // 返回栈元素的个数
29 int Size_LinkStack(LinkStack* stack);
30 // 清空栈
31 void Clear_LinkStack(LinkStack* stack);
32 // 销毁栈
33 void FreeSpace_LinkStack(LinkStack* stack);
34
35
36
37 #endif
LinkStack.h
1 #include "LinkStack.h"
2
3
4 // 初始化
5 LinkStack* Init_LinkStack(){
6
7 // 开内存
8 LinkStack* stack = (LinkStack*)malloc(sizeof(LinkStack));
9 // 初始化
10 stack->HeadNode.next = NULL;
11 stack->size = 0;
12
13 return stack;
14 }
15
16 // 入栈
17 void Push_LinkStack(LinkStack* stack,LinkNode* data){
18
19 if(stack == NULL){
20 return;
21 }
22 if(data == NULL){
23 return;
24 }
25
26 data->next = stack->HeadNode.next;
27 stack->HeadNode.next = data;
28
29 stack->size++;
30
31 }
32
33 // 出栈 (删除第一个元素)
34 void Pop_LinkStack(LinkStack* stack){
35
36 if(stack == NULL){
37 return ;
38 }
39 if(stack->size==0){
40 return ;
41 }
42
43 // 第一个有效节点
44 LinkNode* pNext = stack->HeadNode.next;
45 stack->HeadNode.next = pNext->next; // pNext.next为第一个有效节点的下一个节点
46
47 stack->size--;
48
49 }
50
51 // 返回栈顶元素
52 LinkNode* Top_LinkStack(LinkStack* stack){
53
54 if(stack == NULL){
55 return NULL;
56 }
57 if(stack->size==0){
58 return NULL;
59 }
60
61 return stack->HeadNode.next;
62 }
63
64 // 返回栈元素的个数
65 int Size_LinkStack(LinkStack* stack){
66 if(stack == NULL){
67 return -1;
68 }
69 return stack->size;
70 }
71
72 // 清空栈
73 void Clear_LinkStack(LinkStack* stack){
74
75 if(stack == NULL){
76 return;
77 }
78 stack->HeadNode.next = NULL;
79 stack->size=0;
80
81 }
82
83 // 销毁栈
84 void FreeSpace_LinkStack(LinkStack* stack){
85
86 if(stack == NULL){
87 return;
88 }
89
90 free(stack);
91
92
93 }
C语言- 基础数据结构和算法 - 09 栈的应用_中缀表达式转后缀表达式20220611的更多相关文章
- C语言- 基础数据结构和算法 - 08 栈的应用_就近匹配20220611
听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...
- C语言- 基础数据结构和算法 - 栈的链式存储
听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...
- C语言- 基础数据结构和算法 - 栈的顺序存储
听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...
- C语言- 基础数据结构和算法 - 队列的顺序存储
听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...
- C语言- 基础数据结构和算法 - 循环链表
听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...
- C语言 - 基础数据结构和算法 - 企业链表
听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...
- C语言 - 基础数据结构和算法 - 单向链表
听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...
- C语言- 基础数据结构和算法 - 动态数组
听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...
- 大数据技术之_16_Scala学习_13_Scala语言的数据结构和算法_Scala学习之旅收官之作
第十九章 Scala语言的数据结构和算法19.1 数据结构(算法)的介绍19.2 看几个实际编程中遇到的问题19.2.1 一个五子棋程序19.2.2 约瑟夫问题(丢手帕问题)19.2.3 其它常见算法 ...
随机推荐
- 微信小程序加密解密参数
加密:encodeURIComponent(参数) 解密:decodeURIComponent(参数)
- dotnet new 命令笔记
让dotnet new使用平台特定的目标,例如net6.0-windows10.0.19041.0 dotnet new console --name CallWinRTConsole --frame ...
- SpringMVC基于注解开发的步骤
基于xml配置 .1准备好以下相关jar包 .2创建Maven项目使用骨架 (这里选择第二个以webapp结尾的非第一个) 给项目起个名字 这里可以更改maven本地仓库(依赖包所存放的地方)的路径 ...
- IDEA小技巧:Debug拖动跳转任意行
昨天分享了一个在IDEA中为Debug断点添加条件的小技巧.今天继续分享一个Debug过程中非常实用的小插件. 插件名字叫Jump To Line: 安装完成之后,你在Debug过程中,会在断点的左边 ...
- openoffice将word转pdf中文乱码或消失的坑
将windows系统下的中文字体文件(C:\Windows\Fonts),放到/usr/share/fonts下,必须重启openoffice.
- mysql的半同步复制
1. binlog dump线程何时向从库发送binlog mysql在server层进行了组提交之后,为了提高并行度,将提交阶段分为了 flush sync commit三个阶段,根据sync_bi ...
- 2021.08.09 P6037 Ryoku的探索(基环树)
2021.08.09 P6037 Ryoku的探索(基环树) P6037 Ryoku 的探索 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.树的性质 2.基环树的性质 ...
- 【远程文件浏览器】Unity+Lua开发调试利器
Remote File Explorer是一个跨平台的远程文件浏览器,用户通过Unity Editor就能操作运行在手机上的游戏或是应用的的目录文件.比如当项目打包运行到设备上时,可通过Remote ...
- jmeter工具初探
jmeter工具初探 一.jmeter工具介绍 1.一种免费的java开源工具,可以进行二次开发 2.运行环境:java运行环境,需要安装JDK,配置JAVAHOME 环境变量 3.下载jmeter: ...
- 程序员延寿指南「GitHub 热点速览 v.22.17」
很多人对程序员的固有印象之一便是常加班.易"猝死"!近几年的许多报道似乎也进一步加深了这种印象.应该如何更好地健康地活着.敲喜欢的代码呢?HowToLiveLonger 教你如何从 ...