栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
设计的栈结构中包括数据数组以及top坐标,这里top指向的栈顶元素的位置,初始top为-1,代表栈为空
typedef struct{
int data[MAXSIZE];
//采用top指针指向栈顶元素的方式 初始为-1
int top;
} MStack;
//初始化栈
void initStack(MStack *mStack){
mStack->top=-1;
}
入栈首先需要判断栈是否满了,这里设置栈大小为20,由0下标开始,即top指向19时就代表栈满了 然后进行top自增并添加数据
//入栈
void add(MStack *mStack,int data){
if(mStack->top==19){
//栈已满
return;
}
mStack->data[++(mStack->top)]=data;
}
出栈的操作并没有修改栈中的数据的内容,只是移动了top的值 出栈需要先判断栈是否为空 出栈的同时将栈顶元素赋值给data
//出栈
void pop(MStack *mStack,int *data){
if(mStack->top==-1){
//栈是空的
return;
}
*data=mStack->data[(mStack->top)--];
}
再分配栈大小时,太小会导致数据存储不下,而太大可能又会造成大量的空间被浪费,因此采用共享栈的思想,主要思想就是一个top,默认值为-1,一个down,默认存储栈的最大存储数据量-1。如下图所示
入栈 down向下移动,top向上移动 出栈 down向上移动,top向下移动 判断共享栈是否满了 down-1等于top时就说明栈满了
typedef struct{ int data[MAXSIZE]; int top; int down; } ShareStack;
需要同时对top和down进行初始化
void initShareStack(ShareStack *mStack){
mStack->top=-1;
mStack->down=20;
}
void addTop(ShareStack *mStack,int data){
if(mStack->top==(mStack->down-1)){
//栈已满
return;
}
mStack->data[++(mStack->top)]=data;
}
void addDown(ShareStack *mStack,int data){
if(mStack->top==(mStack->down-1)){
//栈已满
return;
}
mStack->data[--(mStack->down)]=data;
}
//top端出栈
void popTop(ShareStack *mStack,int *data){
if(mStack->top==-1){
//栈是空的
return;
}
*data=mStack->data[(mStack->top)--];
}
//down端出栈
void popDown(ShareStack *mStack,int *data){
if(mStack->down==20){
//栈是空的
return;
}
*data=mStack->data[(mStack->down)++];
}
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAXSIZE 20
typedef struct
{
int data[MAXSIZE];
//采用top指针指向栈顶元素的方式 初始为-1
int top;
} MStack;
//初始化栈
void initStack(MStack *mStack)
{
mStack->top=-1;
}
//入栈
void add(MStack *mStack,int data)
{
if(mStack->top==19)
{
//栈已满
return;
}
mStack->data[++(mStack->top)]=data;
}
//出栈
void pop(MStack *mStack,int *data)
{
if(mStack->top==-1)
{
//栈是空的
return;
}
*data=mStack->data[(mStack->top)--];
}
void forEach(MStack mStack)
{
for(int i=mStack.top; i>-1; i--)
{
printf("%d\n",mStack.data[i]);
}
}
/**
共享栈
**/
typedef struct
{
int data[MAXSIZE];
int top;
int down;
} ShareStack;
void initShareStack(ShareStack *mStack)
{
mStack->top=-1;
mStack->down=20;
}
void addTop(ShareStack *mStack,int data)
{
if(mStack->top==(mStack->down-1))
{
//栈已满
return;
}
mStack->data[++(mStack->top)]=data;
}
//出栈
void popTop(ShareStack *mStack,int *data)
{
if(mStack->top==-1)
{
//栈是空的
return;
}
*data=mStack->data[(mStack->top)--];
}
void addDown(ShareStack *mStack,int data)
{
if(mStack->top==(mStack->down-1))
{
//栈已满
return;
}
mStack->data[--(mStack->down)]=data;
}
//出栈
void popDown(ShareStack *mStack,int *data)
{
if(mStack->down==20)
{
//栈是空的
return;
}
*data=mStack->data[(mStack->down)++];
}
void forEachTop(ShareStack mStack)
{
for(int i=mStack.top; i>-1; i--)
{
printf("%d\n",mStack.data[i]);
}
}
void forEachDown(ShareStack mStack)
{
for(int i=mStack.down; i<20; i++)
{
printf("%d\n",mStack.data[i]);
}
}
void main()
{
MStack mStack;
ShareStack sStack;
initShareStack(&sStack);
initStack(&mStack);
for(int i=0; i<25; i++)
{
addTop(&sStack,i);
addDown(&sStack,i);
}
forEachTop(sStack);
forEachDown(sStack);
}