# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
/*
栈:
分类:
静态栈:内存连续分配
动态栈:内存不连续分配(***)
算法:
进栈
出栈
注意:
栈其实就是链表的一种表现形式
*/
typedef struct Node {
int data;
struct Node * PNext;
}NODE, * PNODE;
//定义栈
typedef struct Stack {
PNODE pTop; //栈顶
PNODE pBottom; //栈底,指向的使用一个无用的节点
}STACK, * PSTACK; //PSTACK等价于 struck Stack *
void init(PSTACK); //初始化
void push(PSTACK,int); //压栈
void print(PSTACK); //打印
void pop(PSTACK); //出栈
int main(void) {
//初始化
STACK S;
init(&S);
//压栈
push(&S,1);
push(&S,2);
push(&S,3);
//遍历
printf("\n打印:\n");
print(&S);
//出线
pop(&S);
pop(&S);
pop(&S);
printf("\n打印:\n");
print(&S);
return 0;
}
//栈的初始化
void init(PSTACK ps) {
ps->pBottom = (PNODE)malloc(sizeof(NODE)); //栈底,指向的使用一个无用的节点
if(NULL == ps->pBottom) {
printf("内存分配失败,栈的初始化失败!\n");
exit(-1);
} else {
ps->pTop = ps->pBottom;
ps->pTop->PNext = NULL; //因为它是栈底节点所以它的指针域应该是空的
printf("栈的初始化成功!\n\n");
}
}
//入栈
void push(PSTACK ps,int val) {
PNODE pnode = (PNODE)malloc(sizeof(NODE)); //创建一个新的节点
pnode->data = val; //数据域赋值
pnode->PNext = ps->pTop; //指针域赋值
ps->pTop = pnode; //栈顶指向该节点(top上移)
printf("%d入栈成功!\n",val);
}
//打印
void print(PSTACK ps) {
PNODE p = ps->pTop;
if(p == ps->pBottom) {
printf("此栈为空栈!\n\n");
return;
}
while(true) {
if(p != ps->pBottom) { //判断是否到达栈底
printf("%d\t",p->data);
p = p->PNext; //p指针下移
}else {
break;
}
}
printf("\n");
}
//出栈
void pop(PSTACK ps) {
int d;
if(ps->pTop != ps->pBottom) { //该站是否非空
PNODE pfree = ps->pTop; //先将栈顶的地址保存到pfree
d = ps->pTop->data; //先将栈顶的数据保存到d
ps->pTop = ps->pTop->PNext; //top指针下移
free(pfree); //释放pfree
pfree = NULL; //pfree置为空
printf("\n%d出栈成功!",d);
}else {
printf("此栈为空,出栈失败!\n");
}
}
结果: