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 }

 

posted @ 2022-06-11 21:13  油腻老张  阅读(27)  评论(0)    收藏  举报