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的更多相关文章

  1. C语言- 基础数据结构和算法 - 08 栈的应用_就近匹配20220611

    听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...

  2. C语言- 基础数据结构和算法 - 栈的链式存储

    听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...

  3. C语言- 基础数据结构和算法 - 栈的顺序存储

    听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...

  4. C语言- 基础数据结构和算法 - 队列的顺序存储

    听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...

  5. C语言- 基础数据结构和算法 - 循环链表

    听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...

  6. C语言 - 基础数据结构和算法 - 企业链表

    听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...

  7. C语言 - 基础数据结构和算法 - 单向链表

    听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...

  8. C语言- 基础数据结构和算法 - 动态数组

    听黑马程序员教程<基础数据结构和算法 (C版本)>,照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友可 ...

  9. 大数据技术之_16_Scala学习_13_Scala语言的数据结构和算法_Scala学习之旅收官之作

    第十九章 Scala语言的数据结构和算法19.1 数据结构(算法)的介绍19.2 看几个实际编程中遇到的问题19.2.1 一个五子棋程序19.2.2 约瑟夫问题(丢手帕问题)19.2.3 其它常见算法 ...

随机推荐

  1. 微信小程序插件组件-Taro UI

    微信小程序组件使用以下官网查看 ↓  ↓  ↓ https://taro-ui.jd.com/#/docs/fab

  2. Python入门-面向对象-特殊方法

    调用拦截功能 class Message: def send(self,info): print("消息发送:",info) class Me: def __getattribut ...

  3. LC-209

    给定一个含有 n 个正整数的数组和一个正整数 target . 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, nums ...

  4. 帝国cms随机调用信息

    我们知道,帝国cms随机调用标签是 [ecmsinfo]1,5,32,0,0,2,0,",'rand()'[/ecmsinfo] 但是这种调用方式在数据量特别大的时候严重影响生成速度,对于中 ...

  5. 十、包机制与JavaDoc

    一.包机制 为了更好的组织类,Java提供了包机制,用于区别类名的命名空间. 包语句的语句格式为: package pkg1[. pkg2[. pkg3...]]; 一般使用公司域名倒置作为包名:例如 ...

  6. HCIE笔记-第六节-CIDR与ICMP

    项目部 58人 地址:194.2.3.128 /26 研发部 100人 地址: 194.2.3.0/25 市场部 27人 地址: 194.2.3.192/27 财务部 15人 地址:194.2.3.2 ...

  7. Mysql、Oracle锁表处理

    MySql解锁方式 1 # 1. 查看当前数据库锁表的情况 2 SELECT * FROM information_schema.INNODB_TRX; 3 # 2. 杀掉查询结果中锁表的trx_my ...

  8. vue - vue基础/vue核心内容

    终于算是顺利进入vue了,确实也只有学了过后才知道,之前三过vue而不学,确实是对的,现在进来了一点都不后悔,ajax.node.js.promise.webpack.git等等确实是除了三大基础外还 ...

  9. 四月总结&五月计划

    四月总结 1. 主要任务 <Effective C++>书 ① 进展: 看完了30讲(共55讲),从4月20号开始居家办公,书落在公司了,一直到昨天29号才去园区上班,耽搁了.30讲之前的 ...

  10. Docker 日志管理最佳实践

    开源Linux 回复"读书",挑选书籍资料~ Docker-CE Server Version: 18.09.6 Storage Driver: overlay2 Kernel V ...