序
栈是一种先进后出的数据结构,本文在链表的基础上实现栈结构。
代码
// stack.h /********************************************************************************************* * 版权所有 : * 文件名称 : queue.h * 文件标识 : 无 * 内容摘要 : 实现队列功能 * 其它说明 : 其它内容的说明 * 当前版本 : V1.00 * 作 者 : * 完成日期 : 2021-12-16 *********************************************************************************************/ #ifndef __STACK_H__ #define __STACK_H__ /***************************************************************/ /* 类型定义 */ /***************************************************************/ typedef List Stack; /***************************************************************/ /* 宏定义 */ /***************************************************************/ #define STACK_HEAD_INIT(name) { &(name), &(name) } #define STACK_HEAD(name) Stack name = STACK_HEAD_INIT(name) #define stack_for_each(pos, head) \ for(pos = (head)->next; pos != (head); pos = pos->next) #define stack_for_each_safe(pos, n, head) \ for (pos = (head)->next, n = pos->next; pos != (head); \ pos = n, n = pos->next) /***************************************************************/ /* 函数声明 */ /***************************************************************/ extern void init_stack_head(Stack *q); extern void stack_push(Stack *q, Stack *head); extern Stack* stack_pop(Stack *head); extern int stack_num(Stack *head); extern int stack_empty(Stack *head); #endif
// stack.c /********************************************************************************************* * 版权所有 : * 文件名称 : list.c * 文件标识 : 无 * 内容摘要 : 实现队列功能 * 其它说明 : 其它内容的说明 * 当前版本 : V1.00 * 作 者 : * 完成日期 : 2021-12-16 *********************************************************************************************/ #include "list.h" #include "stack.h" /****************************************************************************** * 函数名称: init_stack_head * 功能描述: 初始化栈 * 其它说明: 无 * 修改记录: 修改日期 修改人 修改内容 * 2021-12-16 创建 ******************************************************************************/ void init_stack_head(Stack *q) { init_list_head(q); } /****************************************************************************** * 函数名称: stack_push * 功能描述: 入栈 * 其它说明: 无 * 修改记录: 修改日期 修改人 修改内容 * 2021-12-16 chusiyong 创建 ******************************************************************************/ void stack_push(Stack *q, Stack *head) { list_add_head(q, head); } /****************************************************************************** * 函数名称: stack_pop * 功能描述: 出栈 * 其它说明: 无 * 修改记录: 修改日期 修改人 修改内容 * 2021-12-16 创建 ******************************************************************************/ Stack* stack_pop(Stack *head) { Stack *q = head->next; list_del(q); return q; } /****************************************************************************** * 函数名称: stack_num * 功能描述: 获取栈中元素个数 * 其它说明: 无 * 修改记录: 修改日期 修改人 修改内容 * 2021-12-16 创建 ******************************************************************************/ int stack_num(Stack *head) { return list_num(head); } /****************************************************************************** * 函数名称: stack_empty * 功能描述: 判断栈是否为空 * 其它说明: 无 * 修改记录: 修改日期 修改人 修改内容 * 2021-12-16 创建 ******************************************************************************/ int stack_empty(Stack *head) { return list_empty(head); }
使用
#include <stdio.h> #include "list.h" #include "stack.h" typedef struct node { int data; Stack stack; }Node; Node* initNode(int data) { Node *pNode = malloc(sizeof(Node)); pNode->data = data; init_stack_head(&pNode->stack); return pNode; } int main() { STACK_HEAD(stack); stack_push(&initNode(1)->stack, &stack); stack_push(&initNode(2)->stack, &stack); stack_push(&initNode(3)->stack, &stack); Node *p = NULL; p = container_of(stack_pop(&stack), Node, stack); printf("%d\n", p->data); p = container_of(stack_pop(&stack), Node, stack); printf("%d\n", p->data); p = container_of(stack_pop(&stack), Node, stack); printf("%d\n", p->data); return 0; }