数据结构——顺序栈

目录

一、栈的定义和示意图

        1.栈的定义

栈(stack)又名堆栈,它是一种运算受限的线性表,要严格遵循先进后出的原理。

         2.栈的示意图

二、顺序栈的定义和初始化

        1.顺序栈的定义

顺序栈被定义为一个结构体类型,其中Datatype为栈元素的数据类型,data为一个一维数组,用于存储栈中的数据元素,top用于几率栈顶所在的位置。

        2.顺序栈的初始化

初始化操作既创建一个空栈,把栈顶指针设为-1即可。

三、判断栈空和栈满

        1.判断栈是否为空

         2.判断栈是否已满

判断栈空和栈满都是用栈顶指针top来判断,若top为-1则栈空,若top为MAX-1既为栈满(MAX为给定的顺序栈存储空间的总分配量)。

四、顺序栈的进栈和出栈

        1.顺序栈的进栈

入栈要先判断栈是否已满,若没满则先将top指针+1,再将数据放入栈顶位置上。 

        2.顺序栈的出栈

出栈要先判断栈是否已满,若没满则先将栈顶数据带出,再使top指针-1;

注:出栈只是栈顶指针改变,元素还在数组内。

五、顺序栈的创建和出栈并输出

        在了解了上面的内容后就可以进行栈的相关操作,入栈的创建和出栈并输出栈的元素。

        1.顺序栈的创建

栈的创建要先初始化栈,再通过进栈函数输入所需的数据。

        2.顺序栈的出栈并输出栈中元素

用一个变量接受出栈函数带出的数据,并循环直到栈为空为止。

六、代码总览和运行结果


一、栈的定义和示意图

        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 //定义数据类型
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;
}