(一)顺序栈图文解析

顺序栈是指利用顺序存储结构实现的栈,,即利用一组地址连续的存储单位(数组)依次存放自栈底base到栈顶top的数据元素,同时设置指针top表示栈顶元素在顺序栈中的位置。

<mark>用简洁的话来讲</mark>

顺序栈不像顺序表,顺序栈只能从上往下一个个的网数组添加数据,出来也只能从上往下一个一个取出来。
其中栈底base为数组空间,而栈顶top作为一个指针为栈顶确定位置,每添加一个数据,top加一,每减少一个,top减一。

(二) 顺序栈代码解析

(1) 顺序栈的基本操作

1.1 顺序栈的存储结构

#define MAXSIZE 100
typedef struct
{
	int *base;		//栈底指针,指向栈底
	int *top;		//栈顶指针,指向栈顶
	int stacksize;	//栈的最大容量
}SqStack;

1.2 初始化顺序栈

void InitStack(SqStack &S)
{
	S.base=(int*)malloc(MAXSIZE*sizeof(int));//为顺序栈的栈底分配一个最大容量为MAXSIZE的空间
	if(S.base)
		printf("内存分配成功\n");
	S.top=S.base;	//空栈,即栈底等于栈顶
	S.stacksize=MAXSIZE;	//栈的最大容量
}

1.3顺序栈的入栈

void Push(SqStack &S,int e)
{	
	if(S.top-S.base==S.stacksize)//栈满时栈顶到栈顶之间的空间等于栈的最大容量
		printf("栈满!");
	else	//栈顶自加一
		*(S.top++)=e;//先*S.top=e,然后S.top++
}

1.4 顺序栈的出栈

void Pop(SqStack &S,int &e)
{
	if(S.top==S.base)//当栈顶等于栈底,则栈为空
		printf("栈空");
	else	//栈顶自减一
		e=*(--S.top);//先S.top--,然后e=*S.top
}

1.5 取栈顶元素

void GetTop(SqStack S)
{
	if(S.top!=S.base)
		printf("%d",*(S.top-1));//输出栈顶所指位置的下面一个数据元素
}

(2) 顺序栈源代码及测试

2.1 源代码

#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 100
typedef struct
{
	int *base;	
	int *top;	
	int stacksize;		
}SqStack;

void InitStack(SqStack &S)
{
	S.base=(int*)malloc(MAXSIZE*sizeof(int));
	if(S.base)
		printf("内存分配成功\n");
	S.top=S.base;	
	S.stacksize=MAXSIZE;
}

void Push(SqStack &S,int e)
{
	
	if(S.top-S.base==S.stacksize)
		printf("栈满!");
	else
		*(S.top++)=e;
}
void Pop(SqStack &S,int &e)
{
	if(S.top==S.base)
		printf("栈空");
	else
		e=*(--S.top);
}
void GetTop(SqStack S)
{
	if(S.top!=S.base)
		printf("栈顶:%d\n",*(S.top-1));
}
int main()
{
	SqStack S;
	int e;
	InitStack(S);
	Push(S,10);
	Push(S,20);
	Push(S,30);
	printf("入栈10 20 30\n");
	GetTop(S);	
	Pop(S,e);
	printf("出栈一次\n");
	GetTop(S);
	return 0;
}

2.2 测试结果

测试环境 : Windows 10
编译软件 : Visual C++ 6.0