目录
栈(stack)又名堆栈,它是一种运算受限的线性表,要严格遵循先进后出的原理。
顺序栈被定义为一个结构体类型,其中Datatype为栈元素的数据类型,data为一个一维数组,用于存储栈中的数据元素,top用于几率栈顶所在的位置。
判断栈空和栈满都是用栈顶指针top来判断,若top为-1则栈空,若top为MAX-1既为栈满(MAX为给定的顺序栈存储空间的总分配量)。
入栈要先判断栈是否已满,若没满则先将top指针+1,再将数据放入栈顶位置上。
出栈要先判断栈是否已满,若没满则先将栈顶数据带出,再使top指针-1;
在了解了上面的内容后就可以进行栈的相关操作,入栈的创建和出栈并输出栈的元素。
一、栈的定义和示意图
1.栈的定义
栈(stack)又名堆栈,它是一种运算受限的线性表,要严格遵循先进后出的原理。
2.栈的示意图
二、顺序栈的定义和初始化
1.顺序栈的定义
typedef struct
{
DataType data[MAX]; //顺序栈的存储类型
int top; //记录栈顶的指针,在顺序栈中类似于数组下标
}Seqstack;
顺序栈被定义为一个结构体类型,其中Datatype为栈元素的数据类型,data为一个一维数组,用于存储栈中的数据元素,top用于几率栈顶所在的位置。
2.顺序栈的初始化
//栈的初始化
void InitStack(Seqstack* s)
{
s->top = -1; //初始化栈顶指针为-1
}
初始化操作既创建一个空栈,把栈顶指针设为-1即可。
三、判断栈空和栈满
1.判断栈是否为空
//判断栈是否为空
int EmptyStack(Seqstack* s)
{
if (s->top == -1)
return 1; //若空返回1,非空返回0
else
return 0;
}
2.判断栈是否已满
//判断栈是否已满
int FullStack(Seqstack* s)
{
if(s->top==MAX-1)
return 1; //若满返回1,非空返回0
else
return 0;
}
判断栈空和栈满都是用栈顶指针top来判断,若top为-1则栈空,若top为MAX-1既为栈满(MAX为给定的顺序栈存储空间的总分配量)。
四、顺序栈的进栈和出栈
1.顺序栈的进栈
//入栈
int Push(Seqstack* s,DataType x)
{
if (FullStack(s)) //调用函数判断栈是否已满
{
printf("栈满,不可入栈!");
return 0;
}
else
{
s->top++; //将栈顶指针上一位
s->data[s->top] = x;
return 1;
}
}
入栈要先判断栈是否已满,若没满则先将top指针+1,再将数据放入栈顶位置上。
2.顺序栈的出栈
//出栈
int Pop(Seqstack* s,DataType *x)
{
if (EmptyStack(s))
{
return 0;
}
else
{
*x = s->data[s->top];
s->top--;
return 1;
}
}
出栈要先判断栈是否已满,若没满则先将栈顶数据带出,再使top指针-1;
注:出栈只是栈顶指针改变,元素还在数组内。
五、顺序栈的创建和出栈并输出
在了解了上面的内容后就可以进行栈的相关操作,入栈的创建和出栈并输出栈的元素。
1.顺序栈的创建
//创建栈
int CreateStack(Seqstack* s)
{
DataType e;
InitStack(s); //初始化栈
printf("intput data:(输入a停止)\n");
while (scanf("%d", &e)) //循环输入数据并入
Push(s, e);
return 1;
}
栈的创建要先初始化栈,再通过进栈函数输入所需的数据。
2.顺序栈的出栈并输出栈中元素
void printStack(Seqstack* s)
{
DataType e;
while (Pop(s, &e))
printf("%d ", e);
}
用一个变量接受出栈函数带出的数据,并循环直到栈为空为止。
六、代码总览和运行结果
#define _CRT_SECURE_NO_WARNINGS 1
#define MAX 10
#include <stdio.h>
//定义数据类型
typedef int DataType;
//栈的定义
typedef struct
{
DataType data[MAX]; //顺序栈的存储类型
int top; //记录栈顶的指针,在顺序栈中类似于数组下标
}Seqstack;
//栈的初始化
void InitStack(Seqstack* s)
{
s->top = -1; //初始化栈顶指针为-1
}
//判断栈是否为空
int EmptyStack(Seqstack* s)
{
if (s->top == -1)
return 1; //若空返回1,非空返回0
else
return 0;
}
//判断栈是否已满
int FullStack(Seqstack* s)
{
if(s->top==MAX-1)
return 1; //若满返回1,非空返回0
else
return 0;
}
//入栈
int Push(Seqstack* s,DataType x)
{
if (FullStack(s)) //调用函数判断栈是否已满
{
printf("栈满,不可入栈!");
return 0;
}
else
{
s->top++; //将栈顶指针上一位
s->data[s->top] = x;
return 1;
}
}
//出栈
int Pop(Seqstack* s,DataType *x)
{
if (EmptyStack(s))
{
return 0;
}
else
{
*x = s->data[s->top];
s->top--;
return 1;
}
}
//创建栈
int CreateStack(Seqstack* s)
{
DataType e;
InitStack(s); //初始化栈
printf("intput data:(输入a停止)\n");
while (scanf("%d", &e)) //循环输入数据并入
Push(s, e);
return 1;
}
//出栈并输出栈中元素
void printStack(Seqstack* s)
{
DataType e;
while (Pop(s, &e))
printf("%d ", e);
}
int main()
{
Seqstack ss;
printf("开始创建栈:\n");
CreateStack(&ss);
printf("开始出栈并输出栈中元素:\n");
printStack(&ss);
return 0;
}