栈的基本操作(C语言)

本文只有代码,介绍了有关栈的基本操作。

已经过调试没有很大问题。
如有错误,还请批评指正。

一、栈的实现和表示:

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef int SElemType;
typedef int Status;

#define STACK_INIT_SIZE 100//储存空间初始分配量
#define STACKINCREMENT 10  //储存空间分配增量
#define OK 1
#define ERROR 0

//栈的表示
typedef struct
{
	SElemType* base;
	SElemType* top;
	int stacksize;
}SqStack;

二、栈的基本操作:

//函数声明
Status InitStack(SqStack* S);//构造一个空栈InitStack(S)

Status DestroyStack(SqStack* S);//销毁栈DestroyStack(S)

Status ClearStack(SqStack* S);//把S置为空栈ClearStack(S)

Status StackEmpty(SqStack* S);//判断是否为空栈StackEmpty(S)

Status StackLength(SqStack* S);//返回S的元素个数,即栈的长度StackLength(S)

Status GetTop(SqStack* S, SElemType* e);//返回栈顶元素GetTop(S, &e)

Status Push(SqStack* S, SElemType e);//插入元素e为新的栈顶元素Push(S, e)

Status Pop(SqStack* S, SElemType* e);//删除栈顶元素并用e返回其值Pop(S, &e)

Status StackTraverse(SqStack* S);//遍历栈,输出其值StackTraverse(S)

 1、构造一个空栈:

/*---------------------------------------------------------------------------------------
功能:构造一个空栈
参数:1、栈
输出:OK、ERROR
*/
//构造一个空栈InitStack(S)
Status InitStack(SqStack* S)
{
	// 分配初始空间
	S->base = (SElemType*)malloc(sizeof(SElemType) * STACK_INIT_SIZE);
	if (S->base)
	{
		S->stacksize = STACK_INIT_SIZE;//栈的最大长度等于初始长度
		S->top = S->base;// 栈顶与栈底相同
	}
	else
	{
		return ERROR;
	}
	return OK;
}

2、销毁栈: 

/*---------------------------------------------------------------------------------------
功能:销毁栈
参数:1、栈
输出:OK、ERROR
*/
//销毁栈DestroyStack(S)
Status DestroyStack(SqStack* S)
{
	free(S->base);
	S->base = S->top = NULL;
	S->stacksize = 0;
	return OK;
}

3、把S置为空栈:

/*---------------------------------------------------------------------------------------
功能:把S置为空栈
参数:1、栈
输出:OK、ERROR
*/
//把S置为空栈ClearStack(S)
Status ClearStack(SqStack* S)
{
	S->top = S->base;
	return OK;
}

4、判断是否为空栈:

/*---------------------------------------------------------------------------------------
功能:判断是否为空栈
参数:1、栈
输出:OK、ERROR
*/
//判断是否为空栈StackEmpty(S)
Status StackEmpty(SqStack* S)
{
	if (S->top == S->base)
	{
		return OK;
	}
	return ERROR;
}

 5、返回S的元素个数,即栈的长度:

/*---------------------------------------------------------------------------------------
功能:返回S的元素个数,即栈的长度
参数:1、栈
输出:OK、ERROR
*/
//返回S的元素个数,即栈的长度StackLength(S)
Status StackLength(SqStack* S)
{
	return S->top - S->base;
}

6、返回栈顶元素G:

/*---------------------------------------------------------------------------------------
功能:返回栈顶元素G
参数:1、栈 2、元素
输出:OK、ERROR
*/
//返回栈顶元素GetTop(S, &e)
Status GetTop(SqStack* S, SElemType* e)
{
	if (S->top == S->base)
	{
		return ERROR;
	}
	*e = *(S->top - 1);
	return OK;
}

 7、插入元素e为新的栈顶元素:

/*---------------------------------------------------------------------------------------
功能:插入元素e为新的栈顶元素
参数:1、栈 2、元素
输出:OK、ERROR
*/
//插入元素e为新的栈顶元素Push(S, e)
Status Push(SqStack* S, SElemType e)
{
	if (S->top - S->base >= S->stacksize)//栈满
	{
		S->base = (SElemType*)realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(SElemType));
		if (S->base)
		{
			// 栈顶指针为栈底指针加上栈之前的最大长度
			S->top = S->base + S->stacksize;
			// 栈当前的最大长度等于栈之前的最大长度与增加的长度之和
			S->stacksize += STACKINCREMENT;
		}
		else
		{
			return ERROR;
		}
	}
	*S->top++ = e;//先赋值,后栈顶指针上移
	return OK;
}

8、删除栈顶元素并用e返回其值:

/*---------------------------------------------------------------------------------------
功能:删除栈顶元素并用e返回其值
参数:1、栈 2、元素
输出:OK、ERROR
*/
//删除栈顶元素并用e返回其值Pop(S, &e)
Status Pop(SqStack* S, SElemType* e)
{
	if (S->top == S->base)
	{
		return ERROR;
	}
	*e = *--S->top; // 栈顶指针先下移,后赋值
	return OK;
}

 9、遍历栈,输出其值:

/*---------------------------------------------------------------------------------------
功能:遍历栈,输出其值
参数:1、栈 2、元素
输出:OK、ERROR
*/
//遍历栈,输出其值StackTraverse(S)
Status StackTraverse(SqStack* S)
{
	SElemType* p = S->base;
	while (S->top > p)
	{
		printf("%d ", *p++);
	}
	printf("\n");
	return OK;
}

 三、测试主程序 :

void menu()
{
	printf("******************************************\n");
	printf("****** 1.创建空栈    2.销毁栈       ******\n");
	printf("****** 3.清空栈      4.判断是否为空 ******\n");
	printf("****** 5.求栈的长度  6.返回栈顶元素 ******\n");
	printf("****** 7.压栈        8.删除栈顶元素 ******\n");
	printf("****** 9.输出栈      0.退出         ******\n");
	printf("******************************************\n");
}


int main()
{
	SqStack q,* S;
	S = &q;
	SElemType e = 0;
	int input = 1;
	menu();
	while (input)
	{
		printf("请输入要执行的操作:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			if (InitStack(S))
			{
				printf("创建成功!!!\n");
			}
			else
			{
				printf("创建失败~\n");
			}
			break;
		case 2:
			if (DestroyStack(S))
			{
				printf("销毁成功!!!\n");
			}
			else
			{
				printf("销毁失败~\n");
			}
			break;
		case 3:
			if (ClearStack(S))
			{
				printf("栈已清空!\n");
			}
			else
			{
				printf("清空失败~\n");
			}
			break;
		case 4:
			if (StackEmpty(S))
			{
				printf("栈为空!!!\n");
			}
			else
			{
				printf("栈不为空~\n");
			}
			break;
		case 5:
			printf("栈的长度为:%d\n", StackLength(S));
			break;
		case 6:
			if (GetTop(S, &e))
			{
				printf("栈顶元素为:%d\n", e);
			}
			else 
			{
				printf("没有栈顶元素~\n");
			}
			break;
		case 7:
			printf("请输入要插入的元素值:>");
			scanf("%d", &e);
			if (Push(S, e))
			{
				printf("元素插入成功!\n");
			}
			else
			{
				printf("插入失败~\n");
			}
			break;
		case 8:
			if (Pop(S, &e))
			{
				printf("栈顶元素删除成功\n");
			}
			else
			{
				printf("栈为空,无法删除~\n");
			}
			printf("删除的元素为:%d\n", e);
			break;
		case 9:
			printf("此时栈内元素为:");
			StackTraverse(S);
			break;
		case 0:
			printf("退出成功!!!\n");
			break;
		default:
			printf("输入错误,请重新输入!!!\n");
			break;
		}
	}
	system("pause");
	return 0;
}
  • 30
    点赞
  • 184
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值