【数据结构】顺序栈的基本操作

  本篇主要实现了顺序栈的基本操作,包括压栈、出栈、判空、栈大小以及清空和销毁。

头文件

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,然后查看栈顶元素,


  接着出栈,再次查看栈顶元素,


  最后判断栈是否为空,以及查看栈的大小。


猜你喜欢

转载自blog.csdn.net/sustzc/article/details/80659813
今日推荐