数据结构之栈

来源:互联网 发布:意大利爱乐乐团 知乎 编辑:程序博客网 时间:2024/05/19 21:41
简述
    栈是线性表的一种,他遵循先进后出的特性,其实就是封装一下,提供一些符合先进后出特性的方法,我这里用了三种方式实现了。
实现
一,第一种是顺序栈,就是以数组为基础实现的栈
SeqStack.h
#pragma once#define MAX 1024#include<stdio.h>#include<string.h>#include<stdlib.h>typedef struct _SeqStack{void *data[MAX];int size;}seqstack;//栈的初始化seqstack *init_stack();//入栈void push_stack(seqstack *stack, void *data);//出栈void pop_stack(seqstack *stack);//获取栈顶元素void *top_stack(seqstack *stack);//获取栈元素个数int size_stack(seqstack *stack);//销毁栈void desrtoy(seqstack *stack);

SeqStack.c
#include "SeqStack.h"//栈的初始化seqstack *init_stack(){seqstack *stack = (seqstack*)malloc(sizeof(seqstack));if (NULL == stack){return NULL;}for (int i = 0; i < MAX; i++){stack->data[i] = NULL;}stack->size = 0;return stack;}//入栈void push_stack(seqstack *stack, void *data){if (NULL == stack){return;}if (NULL == data){return;}if (stack->size == MAX){return;}stack->data[stack->size] = data;stack->size++;return;}//出栈void pop_stack(seqstack *stack){if (NULL == stack){return;}stack->data[stack->size-1] = NULL;stack->size--;return;}//获取栈顶元素void *top_stack(seqstack *stack){if (NULL == stack){return NULL;}if (stack->size == 0){return NULL;}return stack->data[stack->size - 1];}//获取栈元素个数int size_stack(seqstack *stack){if (NULL == stack){return -1;}return stack->size;}//销毁栈void desrtoy(seqstack *stack){if (NULL == stack){return;}free(stack);}



二,第二种是链栈,就是以链表形式实现的栈
LinkStack.h
#pragma once#include<stdio.h>#include<stdlib.h>#include<string.h>//栈的初始化int init_Stack(void **stack);//元素压栈int insert_Stack(void *stack, void *data);//栈的元素个数int size_Stack(void *stack);//获取栈顶元素void *back_Stack(void *stack);//栈顶元素出栈int pop_Stack(void *stack);//销毁栈(元素全部弹出后销毁)int destroy_Stack_1(void **stack);//销毁栈(把存储的数据和栈一起销毁)int destroy_Stack_2(void **stack);

LinkStack.c
#include"LinkStack.h"//栈节点typedef struct _NodeStack{void *data;struct _NodeStack *next;}NodeStack;//栈头typedef struct _ListStack{NodeStack handle;int size;}ListStack;//栈的初始化int init_Stack(void **stack){if (NULL == stack){return -1;}//创建头节点ListStack *temp = (ListStack *)malloc(sizeof(ListStack));temp->handle.data = NULL;temp->handle.next = NULL;temp->size = 0;//指针间接赋值*stack = temp;return 0;}//元素压栈int insert_Stack(void *stack, void *data){if (NULL == stack){return -1;}if (NULL == data){return -2;}ListStack *temp = (ListStack *)stack;//定义辅助指针变量NodeStack *current = &(temp->handle);for (int i = 0; i < temp->size; i++){current = current->next;}//创建新节点NodeStack *newnode = (NodeStack *)malloc(sizeof(NodeStack));newnode->data = data;newnode->next = NULL;//节点入栈current->next = newnode;//栈元素个数自增temp->size++;return 0;}//栈的元素个数int size_Stack(void *stack){if (NULL == stack){return -1;}ListStack *temp = (ListStack *)stack;return temp->size;}//获取栈顶元素void *back_Stack(void *stack){if (NULL == stack){return NULL;}ListStack *temp = (ListStack *)stack;//辅助指针NodeStack *current = &(temp->handle);for (int i = 0; i < temp->size; i++){current = current->next;}return current->data;}//栈顶元素出栈int pop_Stack(void *stack){if (NULL == stack){return -1;}ListStack *temp = (ListStack *)stack;//辅助指针NodeStack *current = &(temp->handle);for (int i = 0; i < temp->size; i++){current = current->next;}free(current);current = NULL;temp->size--;return 0;}//销毁栈(元素全部弹出后销毁)int destroy_Stack_1(void **stack){if (NULL == stack){return -1;}ListStack *temp = (ListStack *)*stack;temp->handle.next = NULL;temp->size = 0;free(temp);*stack = NULL;return 0;}//销毁栈(把存储的数据和栈一起销毁)int destroy_Stack_2(void **stack){if (NULL == stack){return -1;}ListStack *temp = (ListStack *)*stack;//辅助指针NodeStack *current = temp->handle.next;while (0){//缓冲下一个节点NodeStack *pnext = current->next;free(current);current = pnext;}temp->handle.next = NULL;temp->size = 0;free(temp);*stack = NULL;return 0;}



三,第三种是 以已有链表为容器,再封装一层实现的栈
Stack.h
#pragma once#include"LinkList.h"//栈的初始化void *init_Stack();//元素压栈int insert_Stack(void *stack, void *data);//元素出栈int pop_Stack(void *stack);//获得栈顶元素void *back_Stack(void *stack);//获得栈的大小int size_Stack(void *stack);//销毁栈int destroy_stack(void *stack);

Stack.c
#include"Stack.h"//栈的初始化void *init_Stack(){void *stack = NULL;init_LinkList(&stack);return stack;}//元素压栈int insert_Stack(void *stack, void *data){if (NULL == stack){return -1;}if (NULL == data){return -2;}PushBack_LinkList(stack, data);return 0;}//元素出栈int pop_Stack(void *stack){if (NULL == stack){return -1;} remove_bypos_LinkList(stack, size_LinkList(stack) - 1);return 0;}//获得栈顶元素void *back_Stack(void *stack){if (NULL == stack){return NULL;}return getbypos_LinkList(stack, size_LinkList(stack) - 1);}//获得栈的大小int size_Stack(void *stack){if (NULL == stack){return -1;}return size_LinkList(stack);}//销毁栈int destroy_stack(void *stack){if (NULL == stack){return -1;}destroy_free_LinkList(&stack);return 0;}



原创粉丝点击