- #include<stdio.h>
- #include<stdlib.h>
- #include<stdbool.h>
-
- // 每一个节点的数据类型
- typedef struct Node
- {
- int data;
- struct Node * pNext;
- }NODE, * PNODE; // NODE等价 struct Node PNODE等价于 struct Node *
-
- // 栈
- typedef struct Stack
- {
- PNODE pTop;
- PNODE pBottom;
- }STACK, * PSTACK;
-
- void init(PSTACK pS);
- void push(PSTACK pS, int val);
- void traverse(PSTACK pS);
- bool pop(PSTACK pS, int * val);
- bool empty(PSTACK pS);
- void clear(PSTACK pS);
-
- // 这是一个动态栈
- int main(void) {
- STACK s; // STACK 等价于 stack Stack
-
- init(&s);// 目的是造出一个空栈
- push(&s, 1);
- push(&s, 2);
- push(&s, 3);
- push(&s, 4);
- traverse(&s);
- int val;
- if (pop(&s, &val))
- {
- printf("出栈成功 出栈的元素是%d\n", val);
- } else {
- printf("出栈失败\n");
- }
- traverse(&s);
- clear(&s);
- traverse(&s);
- if (pop(&s, &val))
- {
- printf("出栈成功 出栈的元素是%d\n", val);
- } else {
- printf("出栈失败\n");
- }
- return 0;
- }
-
- void init(PSTACK pS) {
- pS->pTop = (PNODE)malloc(sizeof(NODE));
- if (NULL == pS->pTop)
- {
- printf("动态内存分配失败");
- exit(-1);
- }
- pS->pTop->pNext = NULL; // 初始化头结点为NULL
- pS->pBottom = pS->pTop;
- }
-
- void push(PSTACK pS, int val) {
- PNODE pNew = (PNODE)malloc(sizeof(NODE));
- pNew->data = val; // 填充新数据
- pNew->pNext = pS->pTop; // 追加结果
- pS->pTop = pNew;// 更新top
- }
-
- void traverse(PSTACK pS) {
- PNODE p = pS->pTop;
- printf("开始打印\n");
- while (p != pS->pBottom)
- {
- printf("%d ", p->data);
- p = p->pNext;
- }
- printf("结束打印\n");
- }
-
- bool empty(PSTACK pS) {
- if (pS->pTop == pS->pBottom)
- {
- return true;
- }
-
- return false;
-
- }
-
- bool pop(PSTACK pS, int * val) {
- if (empty(pS))
- {
- return false;
- }
-
- *val = pS->pTop->data;
- PNODE r = pS->pTop;
- pS->pTop = pS->pTop->pNext;
- free(r);
- r = NULL;
-
- return true;
- }
-
- void clear(PSTACK pS) {
- if (empty(pS))
- {
- return;
- }
-
- PNODE p = pS->pTop;
- PNODE q = NULL;
- while (p != pS->pBottom)
- {
- q = p->pNext;
- free(p);
- p = q;
- }
- pS->pTop = pS->pBottom;
- }
运行效果