大作业:实现堆栈模拟

一文就够:实现堆栈模拟

原理解释

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

代码示例

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

#define STACK_INIT_SIZE 20//栈的初始容量
#define STACKINCREMENT 10//栈的补充容量

typedef int ElementType;//使用ElementType类型名代替已知类型名
typedef struct {
	ElementType *base;//base是栈底元素的地址
	ElementType *top;//top - 1是栈顶元素的地址
	int stackSize;//栈的大小
} sqStack;

void InitStack(sqStack *s) { //构造一个空栈,s是sqStack的一个地址,*s仅仅表示传入的应该是一个地址对应s
	s->base = (ElementType *)malloc(STACK_INIT_SIZE * sizeof(ElementType));//开辟内存,并且把地址转换为int*形,存储在s->base中
	if (!s->base) { //说明内存分配失败:NULL
		printf("内存分配失败!");
		exit(-1);//内存分配失败,程序退出
	}
	s->top = s->base;//让栈顶与栈尾指向同一位置
	s->stackSize = STACK_INIT_SIZE;//指定栈的大小
}

ElementType GetTop(sqStack *s) { //返回栈顶元素
	if (s->top == s->base) {
		printf("空栈不能返回栈顶元素");
		exit(-1);
	}

	return *(s->top - 1); //top指向的是栈顶元素的上一个位置,top-1指向的是栈顶元素
}

void Push(sqStack *s, ElementType e) { //实现入栈操作,其中e为待插入元素
	if (s->top - s->base == s->stackSize) {//栈满,需要追加内存空间
		s->base = (ElementType *)realloc(s->base, (STACK_INIT_SIZE + STACKINCREMENT) * sizeof(ElementType));
		//重新分配动态存储区
		if (!s->base) { //说明内存分配失败:NULL
			printf("内存分配失败!");
			exit(-1);//内存分配失败,程序退出
		}
		s->top = s->base + s->stackSize;//base指向改变,同样的top的值也应该改变
		s->stackSize += STACKINCREMENT;//追加了存储空间,说明栈s的长度也发生了改变
	}
	*(s->top) = e;
	(s->top)++;
}

void Pop(sqStack *s) {//出栈操作,删除栈顶元素
	if (s->top == s->base) {
		printf("空栈不能删除元素");
		exit(-1);
	}
	(s->top)--;
}

void ShowStack(sqStack *s) {
	if (s->top == s->base) {
		printf("空栈没有元素");
		exit(-1);
	}

	int i;
	printf("栈内元素自顶向下的输出\n");
	ElementType *temp = s->top;

	while (1) {
		temp--;
		printf("%d ", *temp);

		if (temp == s->base) {
			break;
		}
	}
	printf("\n\n");
}

int main() {
	sqStack stk;
	InitStack(&stk);//创建一个空栈
	int choice,n,i,pushNum,isLoop=1;

	printf("<<<已创建了一个空栈>>>");

	while(isLoop) {
		printf("\n输入 1-实现入栈操作,2-实现出栈操作,3-实现返回栈顶元素操作,4-退出\n");
		scanf("%d",&choice);

		switch(choice) {
			case 1:
				printf("*****实现入栈操作*****\n");
				printf("输入准备给栈存储元素数量:");
				scanf("%d", &n);
				printf("输入n个元素值:");

				for (i = 0; i < n; i++) {
					scanf("%d", &pushNum);
					Push(&stk, pushNum);
				}
				break;
			case 2:
				printf("*****实现出栈操作*****\n");
				printf("请输入想删除元素数量:");
				scanf("%d", &n);

				for (i = 0; i < n; i++) {
					Pop(&stk);
				}
				break;
			case 3:
				printf("*****实现获取栈顶元素操作*****\n");
				printf("栈顶元素为:%d\n", GetTop(&stk));
				break;
			case 4:
				isLoop = 0;
				break;
			default:
				printf("输入错误,重新输入\n");
				continue;
		}

		printf("**********************\n");

		ShowStack(&stk);
	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值