C语言- 基础数据结构和算法 - 10 栈的应用_根据后缀表达式求解20220611
10 栈的应用_根据后缀表达式求解20220611
听黑马程序员教程《基础数据结构和算法 (C版本)》,
照着老师所讲抄的,
视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1
喜欢的朋友可以去看看,欢迎大家一起交流学习。
/*
计算机是如何基于后缀表达式计算的?
例如:831-5*+
计算规则:
遍历后缀表达式中的数字和符号
对于数字:进栈
对于符号:
从栈中弹出右操作数 如在"2+3"中,右操作数为3
从栈中弹出左操作数 如在,,,, 左,,,,2
根据符号进行运算
将运算结果压入栈中
遍历结束:栈中唯一数字为计算结果
*/
10 栈的应用_根据后缀表达式求解20220611_main.c
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 #include "LinkStack.c" 6 7 /* 8 计算机是如何基于后缀表达式计算的? 9 例如:831-5*+ 10 计算规则: 11 遍历后缀表达式中的数字和符号 12 对于数字:进栈 13 对于符号: 14 从栈中弹出右操作数 如在"2+3"中,右操作数为3 15 从栈中弹出左操作数 如在,,,, 左,,,,2 16 根据符号进行运算 17 将运算结果压入栈中 18 遍历结束:栈中唯一数字为计算结果 19 */ 20 21 typedef struct MYNUM{ 22 LinkNode node; 23 int val; 24 }MyNum; 25 26 // 判断是否是数字 27 int IsNumber(char c){ 28 return c >='0' && c <='9'; 29 } 30 31 // 计算 32 int Caculate(int left,int right,char c){ 33 int ret = 0; 34 switch(c){ 35 case '+': 36 ret = left+right; 37 break; 38 case '-': 39 ret = left-right; 40 break; 41 case '*': 42 ret = left*right; 43 break; 44 case '/': 45 ret = left/right; 46 break; 47 default: 48 break; 49 } 50 51 return ret; 52 } 53 54 55 int main(){ 56 printf("好好学习,天天向上~!\t\t\t 10 栈的应用_后缀式转中缀式20220611\n\n"); 57 58 // 后缀表达式 59 char* str = "831-5*+"; 60 char* p = str; 61 62 LinkStack* stack = Init_LinkStack(); 63 // 遍历 64 while(*p!='\0'){ 65 // 如果是数字则入栈 66 if(IsNumber(*p)){ 67 68 MyNum* num =(MyNum*)malloc(sizeof(MyNum)); 69 num->val = *p - '0'; // char转为int 70 Push_LinkStack(stack,(LinkNode*)num); 71 printf("num_val=%d\n",num->val); 72 //free(num); 73 74 }else{ // 不是数字则是运算符 75 76 // 先从栈中弹出右操作数(弹出数放在运算符右边) 77 MyNum* right = (MyNum*)Top_LinkStack(stack); 78 int rightNum = right->val; 79 printf("rightNum=%d\n",rightNum); 80 Pop_LinkStack(stack); 81 free(right); 82 83 // 再取左操作数 84 MyNum* left = (MyNum*)Top_LinkStack(stack); 85 int leftNum = left->val; 86 printf("leftNum=%d\n",leftNum); 87 Pop_LinkStack(stack); 88 free(left); 89 90 // 计算 91 int ret = Caculate(leftNum,rightNum,*p); 92 // 计算结果入栈 93 MyNum* num =(MyNum*)malloc(sizeof(MyNum)); 94 num->val = ret; 95 Push_LinkStack(stack,(LinkNode*)num); 96 97 } 98 99 p++; 100 101 } 102 103 if(Size_LinkStack(stack)==1){ 104 MyNum* num = (MyNum*)Top_LinkStack(stack); 105 printf("计算结果为:%d",num->val); 106 Pop_LinkStack(stack); 107 free(num); 108 109 } 110 111 // 释放 112 FreeSpace_LinkStack(stack); 113 printf("\n\n"); 114 system("pause"); 115 116 return 0; 117 }
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 }
本文来自博客园,作者:油腻老张,转载请注明原文链接:https://www.cnblogs.com/stou/p/16366822.html
浙公网安备 33010602011771号