对于栈的简单练习
/***********************************************************
* Description: 对于栈的练习
* 本次主要是栈和队列中的顺序栈的练习
* 主要是针对王道书上的内容进行练习
* 包括栈的初始化、判空栈、出栈、入栈、读栈顶元素等
* 值得注意的是本次的练习 的栈底指针是从-1开始
* 后续会给出从 0 开始的 并且会比较其中的不同之处
* Author:qichaoqun
* Date: 2019/08/08
************************************************************/
#include "stdlib.h"
#include "stdio.h"
#define MAX_SIZE 10
typedef int ElemType;
/**
* 定义顺序栈
*/
typedef struct {
//使用数组来模拟顺序栈
ElemType data[MAX_SIZE];
//定义栈顶指针
int top;
} SqStack;
void showMenu();
bool initStack(SqStack &sqStack);
bool isEmptyStack(SqStack &sqStack);
bool pushStack(SqStack &sqStack, int value);
bool outStack(SqStack &sqStack);
int getTopValue(SqStack &sqStack);
void getValues(SqStack &sqStack);
int main() {
bool isExit = false;
//定义该顺序栈
SqStack sqStack;
while (!isExit) {
showMenu();
int option;
scanf("%d", &option);
switch (option) {
case 1:
//初始化顺序栈
if (initStack(sqStack)) {
printf("初始化顺序栈成功\n");
}
break;
case 2:
//判断栈是否为空
if (isEmptyStack(sqStack)) {
printf("该栈为空栈\n");
} else {
printf("该栈不为空栈\n");
}
break;
case 3:
//进栈
printf("请输入你要进栈的元素的值 ");
int value;
scanf("%d", &value);
if (pushStack(sqStack, value)) {
printf("进栈成功\n");
} else {
printf("进栈失败\n");
}
break;
case 4:
//出栈
if (outStack(sqStack)) {
printf("出栈成功\n");
} else {
printf("出栈失败\n");
}
break;
case 5: {
//获取栈顶元素
int topValue = getTopValue(sqStack);
if (topValue != -65535) {
printf("栈顶的元素为 %d\n", topValue);
} else {
printf("该栈为空\n");
}
break;
}
case 6:
//查看栈中的所有的元素
getValues(sqStack);
break;
case 7:
//退出
isExit = true;
break;
default:
printf("输入有误请重新输入");
break;
}
}
return 0;
}
/**
* 查看栈中的所有的元素
*/
void getValues(SqStack &sqStack){
//定义辅助栈顶指针
int newTop = sqStack.top;
printf("栈中的元素为\n");
while (newTop != -1){
printf("%d\n",sqStack.data[newTop]);
newTop--;
}
}
/**
* 获取栈顶的元素
* 注意 -65535 为标记的栈为空的返回值
* 实际开发中并不能这样写
*/
int getTopValue(SqStack &sqStack) {
if (sqStack.top != -1) {
//栈非空,则获取栈顶的元素
return sqStack.data[sqStack.top];
}
return -65535;
}
/**
* 出栈的操作
*/
bool outStack(SqStack &sqStack) {
if (sqStack.top == -1) {
//栈为空则不能出栈
return false;
}
//栈不为空则出栈
int outValue = sqStack.data[sqStack.top];
sqStack.top--;
printf("出栈的元素为 %d", outValue);
return true;
}
/**
* 进栈的操作
*/
bool pushStack(SqStack &sqStack, int value) {
if (sqStack.top < MAX_SIZE - 1) {
//如果栈未满,则进栈
sqStack.data[++sqStack.top] = value;
return true;
}
return false;
}
/**
* 判断栈是否为空
*/
bool isEmptyStack(SqStack &sqStack) {
if (sqStack.top == -1) {
return true;
}
return false;
}
/**
* 初始化顺序栈
* @param sqStack 顺序栈
* @return 初始化是否成功
*/
bool initStack(SqStack &sqStack) {
sqStack.top = -1;
return true;
}
void showMenu() {
printf(" 对于顺序栈的练习\n");
printf("1 初始化顺序栈栈\n");
printf("2 判断栈是否为空\n");
printf("3 进栈\n");
printf("4 出栈\n");
printf("5 获取栈顶元素\n");
printf("6 查看栈中所有元素\n");
printf("7 退出\n");
printf("请输入你的选择 ");
}