一、定义:

#define MaxSize 50

typedef int ElemType;
typedef struct {
	ElemType data[MaxSize];
	int top;
} SqStack;

1. 由于是顺序栈的实现,故定义一个连续存放的数组来存放元素;
2. 再定义一个int类型的变量存放栈顶元素的数组元素表示。(此小结初始化栈顶top=-1,即   top直接指代栈顶元素的下标)。

二、基本操作

void InitStack(SqStack& S);//1.初始化栈
bool StackEmpty(SqStack S);//2.判断栈是否为空
bool Push(SqStack& S, ElemType e);//3.进栈
bool Pop(SqStack& S, ElemType& e);//4.出栈
bool GetTop(SqStack& S, ElemType& e);/5./获取栈顶元素
void print(SqStack S);//6.打印输出栈
void DestroyStack(SqStack& S);//7.销毁栈

1. void InitStack(SqStack& S) 
输入:将顺序栈输入,由于需要修改顺序栈,故加“&”
过程:top = -1 (注意此处的赋值不唯一)
返回值:无需返回任何值

2. bool StackEmpty(SqStack S) 
输入:输入顺序栈,由于无需修改,故无需加“&”
过程:判断top值
返回值:若空则返回“true”;若非空则返回“false”

3. bool Push(SqStack& S, ElemType e)
输入:输入顺序栈和入栈元素值,由于需要修改顺序栈,故加引用“&”
过程:顺序栈需先判断栈是否满;再通过top值的变化,将需入栈元素入栈
返回值:若栈满则返回“false”,若栈未满则入栈后返回“true”

4. bool Pop(SqStack& S, ElemType& e)
输入:输入顺序栈和出栈元素值,由于需要改变顺序栈以及返回出栈元素的值,故两形参前都应加引用“&”
过程:出栈需先判断栈中是否有元素;再通过top值的变化,将元素出栈
返回值:若栈空则返回“false”,若栈非空则出栈后返回“true”

5. bool GetTop(SqStack S, ElemType& e)
输入:输入顺序栈和栈顶元素值,无需改变顺序栈但需返回栈顶元素值,故后一形参需加引用“&”
过程:先判断栈是否为空,若其为空则自然无栈顶元素;再返回栈顶元素值
返回值:若栈空则返回“false”,若栈非空则返回“true”

6. void DestroyStack(SqStack& S) 
输入:输入顺序栈,要改变,加“&”
过程:改变top值为-1,即可视为栈被清空
返回值:无需返回值0

三、代码

编译软件:VS2019
编译语言:C++

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

#define MaxSize 50

typedef int ElemType;
typedef struct {
	ElemType data[MaxSize];
	int top;
} SqStack;

void InitStack(SqStack& S);//初始化栈
bool StackEmpty(SqStack S);//判断栈是否为空
bool Push(SqStack& S, ElemType e);//进栈
bool Pop(SqStack& S, ElemType& e);//出栈
bool GetTop(SqStack S, ElemType& e);//获取栈顶元素
void print(SqStack S);//打印输出栈
void DestroyStack(SqStack& S);//销毁栈

int main(void) {	
	SqStack S;
	//1.初始化栈
	InitStack(S);
	//2.判断栈是否为空
	if (StackEmpty(S)) {
		printf("栈为空!\n");
	}
	else {
		printf("栈的输出为:");
		print(S);
		printf("\n");
	}
	//3.进栈
	Push(S, 1);
	Push(S, 2);
	Push(S, 3);
	Push(S, 4);
	Push(S, 5);
	if (StackEmpty(S)) {
		printf("栈为空!\n");
	}
	else {
		printf("栈的输出为:");
		print(S);
		printf("\n");
	}
	//4.出栈
	int e;
	Pop(S, e);
	printf("执行出栈操作,被删除元素为:%d.\n", e);
	Pop(S, e);
	printf("执行出栈操作,被删除元素为:%d.\n", e);
	if (StackEmpty(S)) {
		printf("栈为空!\n");
	}
	else {
		printf("栈的输出为:");
		print(S);
		printf("\n");
	}
	//5.读取栈顶元素
	GetTop(S, e);
	printf("栈顶元素为:%d.\n", e);
	//6.销毁栈
	DestroyStack(S);
	if (StackEmpty(S)) {
		printf("栈为空!\n");
	}
	else {
		printf("栈的输出为:");
		print(S);
		printf("\n");
	}
	
	return 0;
}

//1.初始化栈
void InitStack(SqStack& S) {
	S.top = -1;
}

//2.判断栈是否为空
bool StackEmpty(SqStack S) {
	if (-1 == S.top) {
		return true;
	}
	else
		return false;
}

//3.入栈操作
bool Push(SqStack& S, ElemType e) {
	//判断栈是否满
	if (S.top == MaxSize - 1) {
		return false;
	}
	//执行插入操作
	S.top = S.top + 1;
	S.data[S.top] = e;
	return true;
}

//4.出栈操作
bool Pop(SqStack& S, ElemType& e) {
	//判断栈是否空
	if (-1 == S.top) {
		return false;
	}
	//执行删除操作
	e = S.data[S.top];
	S.top = S.top - 1;
	return true;
}

//5.读取栈顶元素
bool GetTop(SqStack S, ElemType& e) {
	if (-1 == S.top) {
		return false;
	}
	e = S.data[S.top];
	return true;
}


//6.销毁栈
void DestroyStack(SqStack& S) {
	S.top = -1;
}

//7.打印输出
void print(SqStack S) {
	int i = 0;
	for (i = 0; i <= S.top; i++) {
		printf("%d ", S.data[i]);
	}
}

 四、结果

android 栈顶 获取 栈顶top=-1_c++

 五、分析

android 栈顶 获取 栈顶top=-1_算法_02