顺序栈的实现
顺序栈的有关操作:
说明:
/*
(元素的入栈和出栈只能在栈顶操作)
顺序栈的实现 :
1、申请一段内存容量
2、保存获取到内存空间的基地址
3、当元素入栈后更新栈顶位置(postion++)
当元素出栈后更新栈顶位置(postion–)
注意: 操作时注意判断边界 入栈时判断是否还有剩余容量 出栈时判断是否超过基地址
*/
stack.h文件
#include #include #define CAPACITY 5 //初始化容量typedef struct { int *base; //存储栈的基地址 int postion; //保存栈顶元素的下一位置 int capacity; //栈的容量}SeqStack;void InitSeqStack(SeqStack *seqstack); //初始化顺序栈boolean IsFull(SeqStack *seqstack); //判断栈是否已满boolean IsEmpty(SeqStack *seqstack); //判断栈是否为空void Push(SeqStack *seqstack,int val); //数据入栈void Pop(SeqStack *seqstack); //数据出栈void print_data(SeqStack *seqstack,int length); //输出栈元素void IncreaseCapacity(SeqStack *seqstack); //栈扩容 void GetCapacity(SeqStack *seqstack); //输出栈容量
stack.c文件
#include "Stack.h"void main(){ SeqStack seqstack; InitSeqStack(&seqstack); int a[] = {1,2,3,4,5,6,7,8,9,10,11}; int length = sizeof(a) / sizeof(a[0]); for(int i = 0; i < length;i++) { Push(&seqstack,a[i]); } print_data(&seqstack,length); GetCapacity(&seqstack); system("pause"); return ;}
输出结果
初始化顺序栈
void InitSeqStack(SeqStack *seqstack){ int *base = (int *)malloc(sizeof(int) * CAPACITY); //申请栈空间 if(base == NULL) { printf("内存申请失败。。。\n"); exit(-1); } seqstack->base = base; //保存申请到栈空间的基地址 seqstack->capacity = CAPACITY; //初始化栈的容量 seqstack->postion = 0; //初始化栈基地址偏移}
判断栈满和为空
boolean IsFull(SeqStack *seqstack){ //若基地址偏移和栈初始化容量相等说明栈已满 if(seqstack->postion == seqstack->capacity) return TRUE; return FALSE;} boolean IsEmpty(SeqStack *seqstack){ //若基地址偏移为零说明栈已空 if(seqstack->postion == 0) return TRUE; return FALSE;}
入栈操作
void Push(SeqStack *seqstack,int val){ if(IsFull(seqstack) == TRUE) { printf("栈已满,无法入栈\n"); IncreaseCapacity(seqstack); } *(seqstack->base + seqstack->postion) = val; //获取存放位置将数据入栈 seqstack->postion ++; //偏移加 1}
出栈操作
void Pop(SeqStack *seqstack){ if(IsEmpty(seqstack) == TRUE) { printf("栈已空,无法出栈。。。\n"); return ; } int delete = *(seqstack->base + seqstack->postion - 1); //临时存放栈顶数据 seqstack->postion --; printf("出栈数据为:%d\n",delete);//将出栈的顶点数据输出}
打印栈数据
void print_data(SeqStack *seqstack,int length){ if(IsEmpty(seqstack) == TRUE) { printf("栈为空,无法输出\n"); return ; } for(int i =0;i < length;i++) { Pop(seqstack); }}
动态扩容
void IncreaseCapacity(SeqStack *seqstack){ printf("栈扩容\n"); int *inc = (int *)realloc(seqstack->base,sizeof(int) * (seqstack->postion * 1.75)); seqstack->base = inc; seqstack->capacity *= 1.75; }
输出栈容量
void GetCapacity(SeqStack *seqstack){ printf("%d\n",seqstack->capacity);}
说明:文章内容为学习笔记,如有侵权联系删除