静态栈
说明: 为什么要使用数组来定义一个栈,主要是为了 leetcode 上面的题目减少内存的。链式栈也可以用,具体思路使用一个预先设定好的数组,栈底就是:a[0],剩下的操作只需要维护一个 index 就可以实现栈。
注意事项:如果你使用的是 mac Xcode 10 测试代码,选择 C 语言。则需要添加一个头文件 #include<stdbool.h>。是使用 C 语言开发的。
栈的头文件: StaticStack.h
//#pragma once
#pragma once
// 数组实现栈
// 数据元素类型
typedef int elemType;
// 栈的最大元素是
#define MAX_COUNT 10
typedef struct staticStack
{
// 栈的数据存储
elemType array[MAX_COUNT];
// 栈顶指针
int top;
// 栈底指针
int base;
}StaticStack;
// 初始化一个栈
bool initStaticStack(StaticStack** statck);
// 压入栈里面
bool pushStaticStack(StaticStack* statck, elemType e);
// 出栈
bool popStaticStack(StaticStack* statck, elemType* e);
// 获取栈顶元素
bool getStaticStackTop(StaticStack* statck, elemType* e);
// 获取栈的长度
int getStaticStackLength(StaticStack* statck);
// 判断栈是否为空
bool isEmptyStaticStack(StaticStack* statck);
// 显示一个栈
void dipPlayStaticStack(StaticStack* statck);
栈的源文件: StaticStack.cpp
#include "StaticStack.h"
#include<stdio.h>
#include<stdlib.h>
// 初始化一个栈
bool initStaticStack(StaticStack** statck)
{
*(statck) = (StaticStack*)malloc(sizeof(StaticStack));
if (!*statck)
{
printf("内存不够!\n");
return false;
}
(*(statck))->top = -1;
(*(statck))->base = 0;
return true;
}
// 压入栈里面
bool pushStaticStack(StaticStack* statck, elemType e)
{
// 这个时候栈不能再添加元素了
if ((statck->top +1) == (MAX_COUNT))
{
printf("元素太多了容纳不下了!\n");
return false;
}
else
{
statck->top = statck->top + 1;
statck->array[statck->top] = e;
}
return true;
}
// 出栈
bool popStaticStack(StaticStack* statck, elemType* e)
{
if (isEmptyStaticStack(statck) == true)
{
printf("栈是空的了!\n");
return false;
}
*e = statck->array[statck->top];
statck->top = statck->top - 1;
return true;
}
// 获取栈顶元素
bool getStaticStackTop(StaticStack* statck, elemType* e)
{
if (isEmptyStaticStack(statck) == true)
{
*e = -1;
return false;
}
else
{
*e = statck->array[statck->top];
return true;
}
}
// 获取栈的长度
int getStaticStackLength(StaticStack* statck)
{
return (statck->base + 2);
}
// 判断栈是否为空
bool isEmptyStaticStack(StaticStack* statck)
{
return (statck->top == -1);
}
// 显示一个栈
void dipPlayStaticStack(StaticStack* statck)
{
printf("当前栈的元素有: \n");
if (isEmptyStaticStack(statck) == true)
{
printf("栈是空的了!\n");
}
else
{
// 打印栈
for (int i = statck->top; i >= 0 ; --i)
{
printf("%d ", statck->array[i]);
}
printf("\n");
}
}
测试文件:
/*
* 测试 文件
*/
#include<stdio.h>
// #include<Windows.h>
#include"StaticStack.h"
int main(int argc, char* argv[])
{
printf("Hello World! Stack\n");
StaticStack* s;
initStaticStack(&s);
pushStaticStack(s, 100);
pushStaticStack(s, 101);
pushStaticStack(s, 102);
dipPlayStaticStack(s);
int e = 0;
popStaticStack(s, &e);
printf("出栈的元素是 %d\n", e);
getStaticStackTop(s, &e);
printf("栈顶的元素是 %d\n", e);
printf("栈的长度是: %d\n",getStaticStackLength(s));
dipPlayStaticStack(s);
// system("pause");
return 0;
}