栈的链式物理结构实现

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);
}



猜你喜欢

转载自blog.csdn.net/chulijun3107/article/details/80182549