0x00数据结构——C语言实现(栈)
栈的实现
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| #ifndef STACK_H |
| #define STACK_H |
| |
| |
| #define MAXLEN 100 |
| typedef enum { |
| false = 0, |
| true |
| } BOOL; |
| |
| |
| struct node; |
| typedef struct node node; |
| typedef struct node *to_node; |
| typedef to_node pos; |
| |
| struct stack_node; |
| typedef struct stack_node stack_node; |
| typedef stack_node *stack; |
| |
| |
| |
| stack create_stack(void); |
| |
| |
| BOOL set_empty(stack s); |
| |
| |
| int calc_length(stack s); |
| |
| |
| |
| int push(stack s, int x); |
| |
| |
| int pop(stack s); |
| |
| |
| int get_val(stack s); |
| |
| |
| BOOL is_empty(stack s); |
| |
| |
| void output(stack s); |
| |
| #endif |
| #include "stack.h" |
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| struct node { |
| int val; |
| struct node *next; |
| }; |
| struct stack_node { |
| int capacity; |
| struct node *top; |
| }; |
| |
| |
| |
| |
| stack create_stack(void) |
| { |
| stack tmp = (stack)malloc(sizeof(stack_node)); |
| if(tmp != NULL) { |
| tmp->top = NULL; |
| tmp->capacity = 0; |
| } |
| return tmp; |
| } |
| |
| |
| BOOL set_empty(stack s) |
| { |
| pos tmp; |
| while(s->capacity != 0) { |
| tmp = s->top; |
| s->top = tmp->next; |
| free(tmp); |
| (s->capacity)--; |
| } |
| return true; |
| } |
| |
| |
| int calc_length(stack s) |
| { |
| return s->capacity; |
| } |
| |
| |
| |
| int push(stack s, int x) |
| { |
| node *tmp = (node *)malloc(sizeof(node)); |
| tmp->val = x; |
| tmp->next = s->top; |
| s->top = tmp; |
| (s->capacity)++; |
| return x; |
| } |
| |
| |
| int pop(stack s) |
| { |
| node *tmp; |
| int r = 0; |
| tmp = s->top; |
| s->top = tmp->next; |
| (s->capacity)--; |
| r = tmp->val; |
| free(tmp); |
| return r; |
| } |
| |
| |
| int get_val(stack s) |
| { |
| return s->top->val; |
| } |
| |
| |
| BOOL is_empty(stack s) |
| { |
| return (s->capacity == 0); |
| } |
| |
| |
| void output(stack s) |
| { |
| pos tmp = s->top; |
| while(tmp != NULL) { |
| printf("%d->", tmp->val); |
| tmp = tmp->next; |
| } |
| printf("|\n"); |
| } |
利用栈进行后缀表达式的计算
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <ctype.h> |
| #include "stack.h" |
| |
| |
| int main() |
| { |
| |
| |
| stack s; |
| int i = 0, len = 0; |
| int tmp1, tmp2; |
| int op; |
| |
| char in[] = {'6','5','2','3','+','8','*','+','3','+','*'}; |
| s = create_stack(); |
| |
| |
| |
| |
| len = strlen(in); |
| |
| for(i = 0; i<len; i++) { |
| tmp1 = in[i]; |
| if(tmp1=='+' || tmp1=='-' || tmp1 == '*' || tmp1 == '/') { |
| op = tmp1; |
| tmp1 = pop(s); |
| tmp2 = pop(s); |
| switch(op) { |
| case '+': push(s, tmp1+tmp2);break; |
| case '-': push(s, tmp1-tmp2);break; |
| case '*': push(s, tmp1*tmp2);break; |
| case '/': push(s, tmp1/tmp2);break; |
| default: break; |
| } |
| } else if(isdigit(tmp1)) { |
| push(s,tmp1-48); |
| } |
| output(s); |
| } |
| |
| output(s); |
| return 0; |
| } |
实验结果
| 6->| |
| 5->6->| |
| 2->5->6->| |
| 3->2->5->6->| |
| 5->5->6->| |
| 8->5->5->6->| |
| 40->5->6->| |
| 45->6->| |
| 3->45->6->| |
| 48->6->| |
| 288->| |
| 288->| |
| Time elapsed: 000:00:047 |
| Press any key to continue |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)