实验2.1 栈的顺序表示和实现

头文件

#include<stdio.h>
#include<stdlib.h>

栈的结构体定义

#define MAXNUM 20 //可存储的最大的数据量
#define ElemType int 
typedef struct //定义栈的顺序表的结构以类型
{
	ElemType stack[MAXNUM]; //栈的数据元素
	int top; //栈顶指针
	//栈底指针bottom默认为0
}SqStack;

初始化顺序栈

void InitStack(SqStack* p)
{
	if (!p)
		printf("分配内存失败.\n"); //讨论p的内存是否已经正确分配
	else
		p->top = -1;//将栈设为空栈,空栈的条件是头指针指向-1
}

插入一个元素

void Push(SqStack* p, ElemType x)
{
	if (p->top < MAXNUM - 1) 
	{
		p->top = p->top + 1; //此处为栈的静态顺序存储,故top指针指向内存空间已有元素,若要再入栈需将栈顶指针向上移一位
		p->stack[p->top] = x; //将元素存入新栈顶指针指向的内存空间
	}
	else
		printf("overflow.\n"); //因为栈是从top=0开始的,所以当top指向maxnum-1时已是最大内存,再插入会满溢
}

删除栈顶元素

ElemType Pop(SqStack* p)
{
	ElemType x;
	if (p->top >= 0) 
	{
		x = p->stack[p->top]; //将此时栈顶指针指向的元素的值取出
		printf("之前的栈顶元素%d已被删除!\n", x);
		p->top = p->top - 1; //将栈顶指针下移,这样之前的栈顶元素就不在栈内了
		return x;
	}
	else
	{
		printf("underflow!\n"); //下溢
		return 0;
	}
}

取栈顶元素的值

ElemType GetTop(SqStack* p)
{
	ElemType x;
	if (p->top >= 0)
	{
		x=p->stack[p->top]; //将栈顶指针指向的元素的值返回到x
		printf("\n栈顶元素为:%d\n", x);
		return x;
	}
	else
	{
		printf("unerflow!\n");//下溢
		return 0;
	}
}

输出栈表

void OutStack(SqStack* p)
{
	int i;
	printf("\n");
	if (p->top<0)
		printf("这是一个空栈\n");
	else
	{
		printf("\n");
		for(i=p->top;i>=0;i--) //按栈的示意图的样子输出,即要从后往前输出
				printf("第%d个数据元素为:%6d\n", i, p->stack[i]);
	}
	
}

置空顺序栈

void SetEmpty(SqStack* p)
{
	p->top = -1; //空栈的表示即栈顶指针指向-1
}

主函数

int main()
{
	SqStack* q;
	int cord;
	ElemType a;
	q = (SqStack*)malloc(sizeof(SqStack)); //给顺序栈q分配内存
	printf("第一次使用必须初始化!\n");
	do
	{
		printf("\n");
		printf("\n				主菜单				\n");
		printf("\n				1	初始化顺序栈				\n");
		printf("\n				2	插入一个元素				\n");
		printf("\n				3	删除栈顶元素				\n");
		printf("\n				4	取出栈顶元素				\n");
		printf("\n				5	置空顺序栈				\n");
		printf("\n				6	结束程序运行				\n");
		printf("\n									\n");
		printf("请从菜单栏中选择要执行的操作");
		scanf_s("%d", &cord);
		printf("\n");
		switch (cord)
		{
		case 1: {
			InitStack(q); //创建一个顺序栈
			OutStack(q);} //输出栈表*
			break;
		case 2: {
			printf("请输入要插入的元素:\n");
			scanf_s("%d", &a);
			Push(q, a); //将元素a压入栈q
			OutStack(q);} 
			  break;
		case 3: {
			Pop(q); //将q中栈顶元素弹出栈
			OutStack(q);} 
			  break;
		case 4: {
			GetTop(q); //去q的栈顶元素的值
			OutStack(q);}
			  break;
		case 5: {
			SetEmpty(q); //将栈置空
			printf("\n顺序栈被置空!\n");
			OutStack(q);}
			  break;
		case 6:exit(0); //正常运行程序并退出程序
			//exit(1)非正常运行程序并退出程序
		}
	} while (cord <= 6);
}

运行结果

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值