#include <stdio.h> #include <malloc.h> #include <stdlib.h> typedef struct Node // 定义一个结构体,包含数据和指向下一个节点的指针 { int data; struct Node * p_next; //指向下一个节点的指针 类型也是struct Node * } NODE, *PNODE; /* 定义一个栈,包含栈顶和栈底节点 */ typedef struct Stack { PNODE p_top; PNODE p_bottom; } STACK, *PSTACK; void init_stack(PSTACK); void push_stack(PSTACK p_stack, int value); void traverse_stack(PSTACK p_stack); bool is_empty(PSTACK p_stack); bool pop_stack(PSTACK p_stack, int *value); void clear_stack(PSTACK p_stack); int main() { STACK S; //定义一个栈 此时 p_top 和 p_bottom 是无效数据,必须初始化 int value; init_stack(&S); push_stack(&S, 1); push_stack(&S, 2); push_stack(&S, 3); traverse_stack(&S); clear_stack(&S); if (pop_stack(&S, &value)) { printf("pop successfully, the element is %d\n", value); } else { printf("pop failed\n"); } traverse_stack(&S); } /* 初始化一个stack */ void init_stack(PSTACK p_stack) { p_stack->p_top = (PNODE)malloc(sizeof(NODE)); //为栈顶分配内存 if (p_stack->p_top == NULL) /* 如果为空返回失败 */ { printf("dynamic memory malloc failed\n"); exit(-1); } else { /* 栈顶节点等于栈底节点 栈顶节点的下一个节点指向为空,需要指向新添加的节点的地址 */ p_stack->p_bottom = p_stack->p_top; p_stack->p_top->p_next = NULL; } } /* 压栈 */ void push_stack(PSTACK p_stack, int value) { PNODE p_new = (PNODE)malloc(sizeof(NODE)); //新申请一块空间给新的节点 p_new->data = value; //新节点的值为value p_new->p_next = p_stack->p_top; //新节点的指针域指向栈顶节点 p_stack->p_top = p_new; //栈顶节点指向新节点 把新节点的地址发送给p_top return; } /* 遍历栈中元素 */ void traverse_stack(PSTACK p_stack) { PNODE p = p_stack->p_top; while (p!= p_stack->p_bottom) { printf("%d ", p->data); p = p->p_next; } printf("\n"); } /* 出栈 */ bool pop_stack(PSTACK p_stack, int *value) { if (is_empty(p_stack)) //判断栈是否为空 { return false; } else { /* 思路: 1.先将栈顶节点的值保存起来 2.栈顶节点的指向下一个节点 3.释放上一个地址的内存 */ PNODE r = p_stack->p_top; //定义一个节点r,指向p_top *value = r->data; //r的值存入value p_stack->p_top = r->p_next; //栈顶指向r->p_next free(r); //删除元素 r = NULL; return true; } } /* 判断栈是否为空 */ bool is_empty(PSTACK p_stack) { if (p_stack->p_top == p_stack->p_bottom) //如果二者相等,则栈为空 { return true; } else { return false; } } /* 清空栈 */ void clear_stack(PSTACK p_stack) { if (is_empty(p_stack)) { return; } else { PNODE p = p_stack->p_top; //定义指针p指向栈顶节点 PNODE q = NULL; //定义指针q /* 当指针p不等于栈底节点时,释放内存 只要p指向的还有下一个元素,q就指向下一个元素,删除p,p指向下一个元素 */ while (p != p_stack->p_bottom) { q = p->p_next; free(p); p = q; } p_stack->p_top = p_stack->p_bottom; } }
以上。