本篇主要实现了顺序栈的基本操作,包括压栈、出栈、判空、栈大小以及清空和销毁。
头文件
stack.h
# ifndef _STACK_H__
# define _STACK_H__
# include <stdio.h>
# include <assert.h>
# include <string.h>
# include <stdlib.h>
# define MAX_SIZE (6)
enum OPTION
{
QUIT, // 退出
PUSH, // 入栈
POP, // 出栈
IS_EMPTY, // 判空
SIZE, // 大小
CLEAR, // 清空
SHOW_TOP, // 显示栈顶元素
DESTORY // 销毁
};
typedef int DataType;
typedef struct Stack
{
DataType data[MAX_SIZE]; // 存放栈的元素
int top; // 用于栈顶指针,类似于游标卡尺的游标
}Stack, *pStack;
void StackInit(pStack pS); // 栈的初始化
void StackPrint(pStack pS); // 打印栈的元素
void StackPush(pStack pS, DataType data); // 入栈
void StackPop(pStack pS); // 出栈
DataType StackTop(pStack pS); // 获取栈顶元素
void StackIsEmpty(pStack pS); // 判断栈是否为空
void StackSize(pStack pS); // 栈的大小
void StackClear(pStack pS); // 清空栈
void StackDestory(pStack pS); // 栈的销毁
# endif // _STACK_H__
源代码
1.stack.c
#define _CRT_SECURE_NO_WARNINGS 1
/*
* Copyright (c) 2018, code farmer from sust
* All rights reserved.
*
* 文件名称:stack.c
* 功能:顺序栈的基本功能内部实现细节
*
* 当前版本:V1.0
* 作者:sustzc
* 完成日期:2018年6月2日20:19:45
*/
# include "stack.h"
/*
* 函数名称:StackInit
*
* 函数功能:栈的初始化,pS->top = 0表示空栈
*
* 入口参数:pS
*
* 出口参数:void
*
* 返回类型:void
*/
void StackInit(pStack pS)
{
assert(NULL != pS);
pS->top = 0;
return;
}
/*
* 函数名称:StackPrint
*
* 函数功能:显示栈顶的元素
*
* 入口参数:pS
*
* 出口参数:void
*
* 返回类型:void
*/
void StackPrint(pStack pS)
{
assert(NULL != pS);
if (pS->top <= 0)
{
printf("栈为空!\n");
exit(-1);
}
else
{
printf("栈顶元素为: %d\n", StackTop(pS));
}
return;
}
/*
* 函数名称:StackPush
*
* 函数功能:入(压)栈
*
* 入口参数:pS, data
*
* 出口参数:void
*
* 返回类型:void
*/
void StackPush(pStack pS, DataType data)
{
assert(NULL != pS);
if (pS->top >= MAX_SIZE)
{
printf("栈已满!\n");
exit(-1);
}
else
{
pS->data[pS->top++] = data;
}
return;
}
/*
* 函数名称:StackPop
*
* 函数功能:出栈
*
* 入口参数:pS
*
* 出口参数:void
*
* 返回类型:void
*/
void StackPop(pStack pS)
{
assert(NULL != pS);
if (pS->top <= 0)
{
printf("栈为空!\n");
exit(-1);
}
else
{
pS->top--;
}
return;
}
/*
* 函数名称:StackTop
*
* 函数功能:获取栈顶元素
*
* 入口参数:pS
*
* 出口参数:void
*
* 返回类型:void
*/
DataType StackTop(pStack pS)
{
assert(NULL != pS);
if (pS->top <= 0)
{
printf("栈为空!\n");
exit(-1);
}
else
{
return pS->data[pS->top - 1];
}
}
/*
* 函数名称:StackIsEmpty
*
* 函数功能:判断栈是否为空
*
* 入口参数:pS
*
* 出口参数:void
*
* 返回类型:void
*/
void StackIsEmpty(pStack pS)
{
assert(NULL != pS);
if (0 != pS->top)
{
printf("栈不为空!\n");
}
else
{
printf("栈为空!\n");
}
return;
}
/*
* 函数名称:StackSize
*
* 函数功能:栈的大小
*
* 入口参数:pS
*
* 出口参数:void
*
* 返回类型:void
*/
void StackSize(pStack pS)
{
assert(NULL != pS);
if (0 == pS->top)
{
printf("栈为空!\n");
}
else
{
printf("栈的大小为: %d\n", pS->top);
}
return;
}
/*
* 函数名称:StackClear
*
* 函数功能:清空栈
*
* 入口参数:pS
*
* 出口参数:void
*
* 返回类型:void
*/
void StackClear(pStack pS)
{
assert(NULL != pS);
pS->top = 0;
printf("清空栈成功!\n");
return;
}
/*
* 函数名称:StackDestory
*
* 函数功能:栈的销毁
*
* 入口参数:pS
*
* 出口参数:void
*
* 返回类型:void
*/
void StackDestory(pStack pS)
{
assert(NULL != pS);
pS->top = 0;
printf("销毁栈成功!\n");
return;
}
2.test.c
#define _CRT_SECURE_NO_WARNINGS 1
/*
* Copyright (c) 2018, code farmer from sust
* All rights reserved.
*
* 文件名称:test.c
* 功能:测试顺序栈的基本功能
*
* 当前版本:V1.0
* 作者:sustzc
* 完成日期:2018年6月2日20:19:31
*/
# include "stack.h"
/*
* 函数名称:MainMenu
*
* 函数功能:顺序栈主菜单显示
*
* 入口参数:void
*
* 出口参数:choose
*
* 返回类型:int
*/
int MainMenu(void)
{
int choose = 0;
printf("**************************************\n");
printf("******* 欢迎操作顺序栈 *******\n");
printf("******* 1. 入栈 2. 出栈 *******\n");
printf("******* 3. 判空 4. 大小 *******\n");
printf("******* 5. 清空 6. 显示 *******\n");
printf("******* 7. 销毁 0. 退出 *******\n");
printf("**************************************\n");
printf("choose>");
assert(1 == scanf("%d", &choose));
return choose;
}
/*
* 函数名称:main
*
* 函数功能:测试的主程序
*
* 入口参数:void
*
* 出口参数:0
*
* 返回类型:int
*/
int main(void)
{
int choose = 0;
Stack s;
//初始化栈
StackInit(&s);
do
{
choose = MainMenu();
switch(choose)
{
case QUIT:
printf("退出栈!\n");
break;
case PUSH:
StackPush(&s, 1);
StackPush(&s, 2);
StackPush(&s, 3);
StackPush(&s, 4);
StackPush(&s, 5);
printf("入栈成功!\n");
break;
case POP:
StackPop(&s);
printf("出栈成功!\n");
break;
case IS_EMPTY:
StackIsEmpty(&s);
break;
case SIZE:
StackSize(&s);
break;
case CLEAR:
StackClear(&s);
break;
case SHOW_TOP:
StackPrint(&s);
break;
case DESTORY:
StackDestory(&s);
break;
default:
printf("输入有误,请重新输入!\n");
break;
}
}while(choose);
return 0;
}
输出结果
首先依次入栈1、2、3、4、5,然后查看栈顶元素,
接着出栈,再次查看栈顶元素,
最后判断栈是否为空,以及查看栈的大小。