C语言数据结构 顺序栈 基本操作的实现

C语言数据结构实验代码如下:

//顺序栈基本操作的实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define MAXSIZE 3
#define STACK_INCREMENT 10
typedef struct SqStack {
	int* base;
	int* top;
	int size;
}SqStack;
//声明一个栈
SqStack S;
//初始化顺序栈
void CreatStack() {
	//创建一个指定空间大小的顺序栈
	S.base = (int*)malloc(MAXSIZE * sizeof(int));
	//判断是否创建成功
	if (!S.base) {
		printf("栈创建有误\n");
		return;
	}
	S.top = S.base;
	S.size = MAXSIZE;
}
//顺序栈扩容
int  StackExpansion() {
	//对当前顺序栈进行扩容
	int* newstack = (int*)malloc((S.size + STACK_INCREMENT) * sizeof(int));
	//判断是否扩容成功
	if (newstack == NULL) {
		printf("顺序栈扩容失败\n");
		return 1;//扩容失败返回1
	}
	for (int i = 0; i < S.size; i++) {
		newstack[i] = S.base[i];
	}
	S.base = newstack;
	S.top = S.base + S.size;
	S.size += STACK_INCREMENT;//更新顺序栈大小
	return 0;//扩容成功返回0
}
//顺序栈依次入栈操作
void InitStack() {
	//默认输入-1为顺序栈结束的标志
	printf("请输入元素:");
	int temp;
	scanf("%d", &temp);
	int i = 0;//定义一个记录当前顺序栈元素个数计数器
	//判断是否输入结束
	while (temp != -1) {
		//判断当前顺序栈是否已满
		if (i >= S.size) {
			if (StackExpansion()) {
				//判断是否扩容成功
				return;
			}
		}
		S.base[i] = temp;
		S.top = S.base + i + 1;//更新栈顶指针
		i++;//更新计数器
		scanf("%d", &temp);
	}
}

//依次打印出栈元素
void PrintStack() {
	//判断顺序栈是否为空
	if (S.base == S.top) {
		printf("顺序栈为空\n");
		return;
	}
	printf("当前栈依次出栈为:");
	int* temp = S.top;//定义一个储存栈顶指针的临时变量
	while (temp - S.base > 0) {
		temp--;
		printf("%d  ", *temp);
	}
}

//插入指定元素为新的栈顶元素
void Push() {
	printf("请输入所插入的新的栈顶元素:");
	int num;
	scanf("%d", &num);
	//判断当前顺序栈是否已满
	if ((S.top - S.base) > S.size) {
		if (StackExpansion()) {
			return;
		}
	}
	*S.top = num;
	S.top++;//更新变量
}

//删除栈顶元素,并输出所删除的元素
void Pop() {
	//判断顺序栈是否为空
	if (S.base == S.top) {
		printf("顺序栈为空,删除操作有误\n");
		return;
	}
	//改变栈顶指针的位置,以达到删除的目的
	S.top--;
	printf("栈顶元素已删除,该元素为:%d\n", *S.top);
}

//判断当前的栈是否为空栈
void StackEmpty() {
	if (S.base == S.top) {
		printf("顺序栈为空\n");
	}
	else {
		printf("顺序栈不为空\n");
	}
}

//菜单
void menu() {
	printf("------------顺序栈基本操作的实现------------\n");
	printf("1.建立一个顺序栈\n");
	printf("2.退出菜单\n");
	printf("请输入你所选择的操作数:");
	int i = 0;
	while (1) {
		scanf("%d", &i);
		switch (i) {
		case 1:
			CreatStack();
			InitStack();
			PrintStack();
			break;
		case 2:
			printf("--------------------------------------------");
			return;
		default:
			printf("\n输入的操作数有误,请重新输入:");
		}
		if (i == 1) {
			break;
		}
	}
	while (1) {
		printf("\n");
		printf("1.插入指定元素为新的栈顶元素\n");
		printf("2.删除栈顶元素,并输出所删除的元素\n");
		printf("3.判断当前的栈是否为空栈\n");
		printf("4.依次打印出栈元素\n");
		printf("5.退出菜单\n");
		printf("请输入你所选择的操作数:");
		scanf("%d", &i);
		switch (i) {
		case 1:
			Push();
			PrintStack();
			break;
		case 2:
			Pop();
			PrintStack();
			break;
		case 3:
			StackEmpty();
			break;
		case 4:
			PrintStack();
			break;
		case 5:
			printf("--------------------------------------------");
			return;
		default:
			printf("\n输入的操作数有误,请重新输入:");
		}
	}
}

//菜单运行
int main() {
	menu();
}

ps.陕理工22级数据结构第二次实验记录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值