-
基本概念:
//栈:限定仅在表尾进行插入和删除操作的线性表 //栈特点:后进先出(后来的反而需要先服务(访问受限的线性表) //栈分为:顺序栈和链式栈 //说明:本文件是不定长的顺序栈,能自动扩容 //栈只能在一端进行插入和删除,插入和删除的这一端称为栈顶,另一端称为栈底
-
头文件.h
#define INIT_SIZE 10 typedef struct stack { int* base;//指向动态内存; int top;//栈顶指针(实际上它是下标,注意书上是指针)//top是当前可以存放数据的下标 int stacksize;//栈的总大小 }Stack,*PStack; //初始化 void InitStack(PStack ps); static bool IsFull(PStack ps);//没有满的概念,一满就扩容 static void Inc(PStack ps); //往栈中填入数据(入栈) bool Push(PStack ps,int val); //获取栈顶元素的值,但不删除 bool GetTop(PStack ps,int *rtval); //获取栈顶元素的值,且删除(出栈) bool Pop(PStack ps,int *rtval); //判空 bool IsEmpty(PStack ps); //获取栈中有效元素的个数 int GetLength(PStack ps); //清空所有的数据 void Clear(PStack ps); //销毁 void Destory(PStack ps);
-
.cpp
#include<stdio.h> #include<stdlib.h> #include<assert.h> #include"stack.h" //初始化 void InitStack(PStack ps) { assert(ps != NULL); if (ps == NULL) { return; } ps->base = (int*)malloc(INIT_SIZE * sizeof(int)); assert(ps->base != NULL); ps->top = 0;//相当于空表 ps->stacksize = INIT_SIZE; } static bool IsFull(PStack ps)//没有满的概念,一满就扩容 { assert(ps != NULL); if (ps == NULL) { return false; } return ps->top == ps->stacksize; } static void Inc(PStack ps) { assert(ps != NULL); if (ps == NULL) { return; } ps->stacksize *= 2;//常用两倍或1.5倍 ps->base=(int*)realloc(ps->base, ps->stacksize * sizeof(int)); assert(ps->base != NULL); //ps->top不用处理 } //往栈中填入数据(入栈) bool Push(PStack ps, int val)//时间复杂度:O(1) { //参数判断 assert(ps != NULL); if (ps == NULL) { return false; } if (IsFull(ps))//判满 { Inc(ps);//扩容 } //在表尾处插入,即入栈 ps->base[ps->top++] = val; //ps->top++; return true; } //获取栈顶元素的值,但不删除 bool GetTop(PStack ps,int *rtval) { assert(ps != NULL); if (ps == NULL) { return false; } if (IsFull(ps)) { return false; } *rtval= ps->base[ps->top - 1];//输出参数 return true; } //获取栈顶元素的值,且删除(出栈) bool Pop(PStack ps, int* rtval)//时间复杂度:O(1) { assert(ps != NULL); if (ps == NULL) { return false; } if (IsFull(ps)) { return false; } *rtval = ps->base[--ps->top];//前置--,这一步就是删除 //ps->top--; return true; } //判空 bool IsEmpty(PStack ps) { assert(ps != NULL); if (ps == NULL) { return false; } return ps->top == 0; } //获取栈中有效元素的个数 int GetLength(PStack ps) { assert(ps != NULL); if (ps == NULL) { return 0; } return ps->top;//有效数据的个数 } //清空所有的数据 void Clear(PStack ps) { assert(ps != NULL); if (ps == NULL) { return ; } ps->top = 0; } //销毁 void Destory(PStack ps) { assert(ps != NULL); if (ps == NULL) { return ; } free(ps->base);//释放动态内存 //置空 ps->base = NULL; ps->top = 0; ps->stacksize = 0; }
-
测试文件.cpp
#include"stack.h" #include<stdio.h> #include<stdlib.h> int main() { Stack s; InitStack(&s); for (int i = 0;i < 13;i++) { Push(&s, i); } int val; if (GetTop(&s, &val)) { printf("%d\n", val); } for (int i = 0;i < 20;i++) { if (Pop(&s, &val)) { printf("%d", val); } else { break; } } Destory(&s); return 0; }