link_stack.h
#ifndef __LINK_STACK_H_ #define __LINK_STACK_H_ typedef struct node{ int num; struct node* p_next; }node; typedef struct { node head,tail;//头节点,尾节点 }stack; //栈的初始化 void stack_init(stack *); //清理站的存储区 void stack_deinit(stack *); //判断栈是不是满了 int stack_full(const stack *); //判断栈是不是空的 int stack_empty(const stack *); //获得栈里有效数字的个数 int stack_size(stack *); //向栈里放一个数字 void stack_push(stack *,int); //从栈里获得下一个数字 int stack_pop(stack *); //从栈里获得下一个数字 int stack_top(stack *); #endif
link_stack.cpp
#include "link_stack.h" #include "stdlib.h" //栈的初始化 void stack_init(stack *p_stack) { p_stack->head.p_next = &(p_stack->tail);//头节点和尾节点绑定 } //清理站的存储区 void stack_deinit(stack *p_stack) { node *p_node = NULL,*p_tmp = NULL; while(p_stack->head.p_next != &(p_stack->tail))//头节点不等于尾节点时,存在有效节点 { node* p_first = &(p_stack->head); node* p_mid = p_first->p_next; node* p_last = p_mid->p_next; p_first->p_next = p_last; free(p_mid); p_mid = NULL; } } //判断栈是不是满了 int stack_full(const stack *p_stack) { return 0;//链式结构不会满,直接返回0 } //判断栈是不是空的 int stack_empty(const stack *p_stack) { return p_stack->head.p_next == &(p_stack->tail);//头节点等于尾节点时为空 } //获得栈里有效数字的个数 int stack_size(stack *p_stack) { node* p_node = NULL; int size = 0; for (p_node = &(p_stack->head);p_node != &(p_stack->tail);p_node = p_node->p_next) { node* p_first = p_node; node* p_mid = p_first->p_next; node* p_last = p_mid->p_next; if(p_mid != &(p_stack->tail))//有效节点不是尾节点时 { size++; } } return size; } //向栈里放一个数字 void stack_push(stack *p_stack,int num) { node *p_node = NULL,*p_tmp = NULL; p_tmp = (node*)malloc(sizeof(node)); if (!p_tmp) { return; } p_tmp->num = num; for (p_node = &(p_stack->head);p_node != &(p_stack->tail);p_node = p_node->p_next) { node* p_first = p_node; node* p_mid = p_first->p_next; node* p_last = p_mid->p_next; if (p_mid == &(p_stack->tail))//有效节点等于尾节点,在尾节点处插入。 { p_first->p_next = p_tmp; p_tmp->p_next = p_mid; break; } } } //从栈里获得下一个数字 int stack_pop(stack *p_stack) { node* p_node = NULL; int num = 0; for (p_node = &(p_stack->head);p_node != &(p_stack->tail);p_node = p_node->p_next) { node* p_first = p_node; node* p_mid = p_first->p_next; node* p_last = p_mid->p_next; if (p_last == &(p_stack->tail))//有效节点的下一个节点是尾节点时,返回当前有效节点 { p_first->p_next = p_last; num = p_mid->num; free(p_mid); p_mid = NULL; return num; } } return -1; } //从栈里获得下一个数字 int stack_top(stack *p_stack) { node* p_node = NULL; for (p_node = &(p_stack->head);p_node != &(p_stack->tail);p_node = p_node->p_next) { node* p_first = p_node; node* p_mid = p_first->p_next; node* p_last = p_mid->p_next; if (p_last == &(p_stack->tail))//获取当前有效节点数字 { return p_mid->num; } } return -1; }
main.cpp
#include "stdio.h" #include "link_stack.h" int main() { stack stk = {0}; stack_init(&stk); stack_push(&stk,1); stack_push(&stk,3); stack_push(&stk,5); stack_push(&stk,7); stack_push(&stk,25); printf("数字个数是:%d\n",stack_size(&stk)); printf("判断的结果是:%d\n",stack_full(&stk)); printf("top结果是:%d\n",stack_top(&stk)); printf("pop结果是:%d\n",stack_pop(&stk)); printf("pop结果是:%d\n",stack_pop(&stk)); printf("pop结果是:%d\n",stack_pop(&stk)); printf("pop结果是:%d\n",stack_pop(&stk)); printf("pop结果是:%d\n",stack_pop(&stk)); printf("判断空的结果是:%d\n",stack_empty(&stk)); stack_deinit(&stk); }