Loading... # 栈 ## 数制的转换 ### 顺序栈 #### 头部 ~~~c #include<stdio.h> #include<malloc.h> #define MAXSIZE 100 typedef int SElemType; // 定义int类型的SElemType名称 typedef int Status; // 定义int类型的Status名称 typedef struct stack // 声明栈结构 { SElemType *base; // 栈底指针 SElemType *top; // 栈顶指针 int stacksize; // 栈的大小 }stack; // 栈名称 ~~~ #### 函数声明 ~~~c // 声明各项操作函数 Status InitStack(stack *S); int StackEmpty(stack *S); int Push(stack *S, int n); int Pop(stack *S, int *e); ~~~ #### 主函数 ~~~c int main(void) { int N, M; printf("请输入十进制数:"); scanf("%d", &N); printf("请输入你要转换的数制(小于十进制):"); scanf("%d", &M); stack S; // 定义栈 InitStack(&S); // 初始化栈 while(N) { Push(&S, N % M); // 取模入栈 N = N / M; } while (!StackEmpty(&S)) { int e; Pop(&S, &e); printf("%d", e); } return 0; } ~~~ #### 初始化 ~~~C // 初始化 Status InitStack(stack *S) { S->base = (int *)malloc(sizeof(int)*MAXSIZE); // 给S->base分配 int大小*MAXSIZE 的空间 if(!S->base) // 若S->base为0则分配空间失败 return 0; S->top = S->base; // 栈顶指向栈底 S->stacksize = MAXSIZE; return 1; } ~~~ #### 判断是否为空 ~~~C // 判断是否为空 int StackEmpty(stack *S) { if (S->top==S->base) return 1; else return 0; } ~~~ #### 入栈 ~~~C // 入栈 int Push(stack *S, int n) { if(S->top-S->base==S->stacksize) // 栈满 return 0; *S->top++ = n; // 元素n压入栈顶,栈顶指针加一 return 1; } ~~~ #### 出栈 ~~~C // 出栈 int Pop(stack *S, int *e) { if(S->top == S->base) // 栈空 return 0; *e = *--S->top; // 元素 return 1; } // 这里出栈使用了指针传递栈顶值 ~~~ 也可以直接返回栈顶值,改动部分为 ~~~C int Pop(stack *S); printf("%d", Pop(&S)); int Pop(stack *S) { if(S->top == S->base) // 栈空返回-1 return -1; else return *--S->top; // 栈不空返回栈顶的值 } ~~~ ### 链栈 #### 头部 ~~~C #include<stdio.h> #include<malloc.h> #define MAXSIZE 100; typedef int SElemType; typedef struct node { SElemType data; // 栈结点的数据域 struct node *next; // 栈结点的指针域 } node; typedef struct LinkStack { int size; struct node *base; struct node *top; }LinkStack; // 栈链的数据结构 ~~~ #### 函数声明 ~~~C LinkStack *InitStack(LinkStack *S); int StackEmpty(LinkStack* S); int Push(LinkStack* S, int n); int Pop(LinkStack* S, int *e); ~~~ #### 主函数 ~~~C int main(void) { int N, M; printf("请输入十进制数:"); scanf("%d", &N); printf("请输入你要转换的数制(小于十进制):"); scanf("%d", &M); LinkStack S; InitStack(&S); while(N) { Push(&S, N % M); N = N / M; } while (!StackEmpty(&S)) { int e; Pop(&S, &e); printf("%d", e); } return 0; } ~~~ #### 初始化 ~~~C LinkStack *InitStack(LinkStack *S) { S->base = (node *)malloc(sizeof(node)); // 为栈底分配存储空间 S->size = 0; // 链栈大小 S->base = S->top = 0; // 栈顶栈底为0 } ~~~ #### 判断是否为空 ~~~C int StackEmpty(LinkStack* S) { if(S->top == S->base) return 1; else return 0; } ~~~ #### 入栈 ~~~C int Push(LinkStack* S, int n) { node *p = (LinkStack *)malloc(sizeof(LinkStack)); p->data = n; // 将值赋给p指针的数据域 p->next = S->top; S->top = p; S->size++; return 1; } ~~~ 具体入栈过程 <img src="http://120.78.215.15/usr/uploads/2021/10/4025608104.png" style="zoom:20%;"/> #### 出栈 ~~~C int Pop(LinkStack* S, int *e) { if(S->top == S->base) return 0; node *p = S->base; *e = S->top->data; p = S->top; S->top = S->top->next; free(p); return 1; } ~~~ 具体出栈过程 <img src="http://120.78.215.15/usr/uploads/2021/10/1893483070.png" style="zoom:20%;"/> [1]: http://120.78.215.15/usr/uploads/2021/10/4025608104.png [2]: http://120.78.215.15/usr/uploads/2021/10/1893483070.png 最后修改:2021 年 11 月 11 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,请随意赞赏