1 栈(stack)的定义
限定在表尾进行插入和删除的操作的线性表,又称先进后出的线性表。
栈管理者
typedef struct stack{
struct node *Top;
int Size;
}maneger, *stackManeger;
栈结点
typedef struct node {
int Data;
struct node *Next;
}node, *stackNode;
2 栈操作的实现
2.1 初始化
// 1.构建一个空栈
stackManeger init_stack(){
stackManeger s = calloc(1, sizeof(maneger));
if( s!=NULL ){
s->Top = NULL;
s->Size = 0;
}
return s;
}
2.2 入栈
// 入栈
void push(int data, stackManeger s){
stackNode stackTop = calloc(1, sizeof(node)); // 申请一个结点空间
if(stackTop != NULL){
stackTop->Data = data; // 赋值
stackTop->Next = s->Top; // 新栈顶指向原来栈顶
s->Top = stackTop; // 栈管理者中栈顶更换
s->Size++; // 栈中数量+1
}
}
2.3 出栈
stackNode pop(stackManeger s){
stackNode tmp = s->Top; // 临时指针指向出栈
s->Top = tmp->Next; // 管理者栈顶转换
tmp->Next = NULL; // 出栈的指针指向NULL
s->Size--;
return tmp;
}
2.4 判断栈是否为空
bool is_empty(stackManeger s){
return s->Size == 0;
}
3 练习
题目:
将十进制数,分别转换为八进制
解题思路:
- 循环地计算8的余数,并将余数挨个入栈
- 从栈中挨个出栈,得到结果
#include "common.h"
// 设计好链式栈结点
typedef struct node {
int Data;
struct node *Next;
}node, *stackNode;
// 设计好栈的管理结构体
typedef struct stack{
struct node *Top;
int Size;
}maneger, *stackManeger;
// 1.构建一个空栈
stackManeger init_stack(){
stackManeger s = calloc(1, sizeof(maneger));
if( s!=NULL ){
s->Top = NULL;
s->Size = 0;
}
return s;
}
// 2 入栈
void push(int data, stackManeger s){
stackNode stackTop = calloc(1, sizeof(node));
if(stackTop != NULL){
stackTop->Data = data; // 赋值
stackTop->Next = s->Top; // 新栈顶指向原来栈顶
s->Top = stackTop; // 栈管理者中栈顶更换
s->Size++; // 栈中数量+1
}
}
// 判断栈是否为空
bool is_empty(stackManeger s){
return s->Size == 0;
}
// 3. 出栈,并返回出栈结点的指针
stackNode pop(stackManeger s){
stackNode tmp = s->Top; // 临时指针指向出栈
s->Top = tmp->Next; // 管理者栈顶转换
tmp->Next = NULL; // 出栈的指针指向NULL
s->Size--;
return tmp;
}
int main(void){
// 1. 构建一个空栈
stackManeger s = init_stack();
//2. 循环地计算余数,并将余数挨个入栈
int n;
scanf("%d", &n);
while( n>0 ){
push(n%8, s); // 将余数入栈到s中
n /= 8;
}
//3. 从栈中挨个出栈,得到结果
printf("0");
stackNode tmp;
while (!is_empty(s)){
tmp = pop(s);
printf("%d", tmp->Data);
free(tmp);
}
printf("\n");
return 0;
}
代码引用常用头文件,如果报错可以参考另外一篇常用头文件 - common.h