数据结构-栈 Posted on 2018-10-15 | In 数据结构 | 基本操作描述:FILO(先进后出) 只允许栈顶进行删除和插入 创建 销毁 长度 是否满 是否空 入栈 出栈 遍历 实现 顺序栈123456789//栈数据typedef struct array_stack{ int size;//栈大小 int pos;//栈顶元素 int *array;//数据存储区}ArrayStack;void array_stack_test(void); 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193#include <stdbool.h>#include <stdlib.h>#include <string.h>/** 获取栈长度 @param stack 栈 @return 栈长度 */int array_stack_length(ArrayStack *stack){ return stack->size;}/** 获取栈是否空 @param stack 栈 @return 是否空 */bool array_stack_is_empty(ArrayStack *stack){ return stack->pos == -1;}/** 获取栈是否满 @param stack 栈 @return 是否满 */bool array_stack_is_full(ArrayStack *stack){ return stack->pos == (stack->size - 1);}/** 初始化栈 @param size 栈大小 @return 栈 */ArrayStack *array_stack_create(int size){ ArrayStack *stack = (ArrayStack *)malloc(sizeof(ArrayStack)); if (stack == NULL) { return NULL; } stack->size = size; stack->pos = -1; stack->array = (int *)malloc(sizeof(int) * size); if (stack->array == NULL) { free(stack); return NULL; } return stack;}/** 销毁栈 @param stack 栈 */void array_stack_destory(ArrayStack *stack){ if (stack == NULL) { return; } if (stack->array != NULL) { free(stack->array); } free(stack); return;}/** 出栈 @param stack 栈 @return 栈顶元素 */int array_stack_pop(ArrayStack *stack){ int data = 0; if (array_stack_is_empty(stack)) { return -1; } data = stack->array[stack->pos]; stack->pos--; return data;}/** 入栈 @param stack 栈 @param data 入栈元素 @return 是否入栈成功 */int array_stack_push(ArrayStack *stack, int data){ if (array_stack_is_full(stack)) { return -1; } stack->pos++; stack->array[stack->pos] = data; return 0;}/** 入栈 不足申请新空间 @param stack 栈 @param data 入栈元素 @return 是否入栈成功 */int array_stack_push_new(ArrayStack *stack, int data){ if (!array_stack_is_full(stack)) { return array_stack_push(stack, data); } int *temp = (int *)malloc(2 * stack->size * sizeof(int)); if (temp == NULL) { return -1; } memcpy(temp, stack->array, stack->size * sizeof(int)); free(stack->array); stack->array = temp; stack->size = 2 * stack->size; stack->pos++; stack->array[stack->pos] = data; return 0;}/** 遍历栈 @param stack 栈 */void array_stack_dump(ArrayStack *stack){ if (array_stack_is_empty(stack)) { printf("栈空\n"); return ; } printf("打印栈size=%d,pos=%d\n",stack->size,stack->pos); for (int i = 0; i <= stack->pos; i++) { printf("array[%d] = %d\n",i,stack->array[i]); }}/** 测试栈 */void array_stack_test(){ ArrayStack *stack = array_stack_create(4); if (stack == NULL) { printf("创建失败\n"); } for (int i = 0; i < 5; i++) { int ret = array_stack_push(stack, i); if (ret != 0) { printf("入栈失败 %d\n",i); } } array_stack_dump(stack); int ret = array_stack_push_new(stack, 4); if (ret != 0) { printf("入栈失败\n"); } array_stack_dump(stack); array_stack_destory(stack);} 链栈123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869//栈数据#include <stdio.h>#include <stdbool.h>typedef struct link_stack{ int data;//数据域 struct link_stack *next;//指针域}LinkStack;/** 获取栈是否空 @param stack 栈 @return 是否空 */bool link_stack_is_empty(LinkStack *stack);/** 初始化栈 @return 栈 */LinkStack *link_stack_create(void);/** 销毁栈 @param stack 栈 */void link_stack_destory(LinkStack *stack);/** 出栈 @param stack 栈 @param data 栈顶元素 @return 是否出栈成功 */int link_stack_pop(LinkStack *stack, int *data);/** 栈顶元素 @param stack 栈 @param data 栈顶元素 @return 是否获取栈顶成功 */int link_stack_top(LinkStack *stack, int *data);/** 入栈 @param stack 栈 @param data 入栈元素 @return 是否入栈成功 */int link_stack_push(LinkStack *stack, int data);/** 遍历栈 @param stack 栈 */void link_stack_dump(LinkStack *stack);/** 测试栈 */void link_stack_test(void); 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165#include <stdbool.h>#include <stdlib.h>#include <string.h>/** 获取栈是否空 @param stack 栈 @return 是否空 */bool link_stack_is_empty(LinkStack *stack){ return stack->next == NULL;}/** 初始化栈 @return 栈 */LinkStack *link_stack_create(){ LinkStack *stack = (LinkStack *)malloc(sizeof(LinkStack)); if (stack == NULL) { return NULL; } stack->next = NULL; return stack;}/** 销毁栈 @param stack 栈 */void link_stack_destory(LinkStack *stack){ LinkStack *temp = NULL; while (!link_stack_is_empty(stack)) { temp = stack->next; stack->next = temp->next; free(temp); } free(stack);}/** 出栈 @param stack 栈 @param data 栈顶元素 @return 是否出栈成功 */int link_stack_pop(LinkStack *stack, int *data){ if (data == NULL) { return -1; } if (link_stack_is_empty(stack)) { return -1; } *data = stack->next->data; LinkStack *temp = stack->next; stack->next = temp->next; free(temp); return 0;}/** 栈顶元素 @param stack 栈 @param data 栈顶元素 @return 是否获取栈顶成功 */int link_stack_top(LinkStack *stack, int *data){ if (data == NULL) { return -1; } if (link_stack_is_empty(stack)) { return -1; } *data = stack->next->data; return 0;}/** 入栈 @param stack 栈 @param data 入栈元素 @return 是否入栈成功 */int link_stack_push(LinkStack *stack, int data){ LinkStack *temp = (LinkStack *)malloc(sizeof(LinkStack)); if (temp == NULL) { return -1; } temp->data = data; temp->next = stack->next; stack->next = temp; return 0;}/** 遍历栈 @param stack 栈 */void link_stack_dump(LinkStack *stack){ printf("打印栈\n"); LinkStack *temp = stack->next; while (temp != NULL) { printf("data = %d\n",temp->data); temp = temp->next; }}/** 测试栈 */void link_stack_test(){ LinkStack *stack = link_stack_create(); if (stack == NULL) { printf("创建失败\n"); } for (int i = 0; i < 4; i++) { int ret = link_stack_push(stack, i); if (ret != 0) { printf("入栈失败%d\n",i); } } link_stack_dump(stack); printf("出栈\n"); int data = 0; for (int i = 0; i < 5; i++) { int ret = link_stack_pop(stack, &data); if (ret != 0) { printf("出栈失败%d\n",i); } else { printf("data = %d\n",data); } } link_stack_destory(stack);}