数据结构(C语言版)严蔚敏——3.1栈

本文详细介绍了使用C语言实现栈数据结构的过程,包括初始化、入栈、出栈、获取栈顶元素和判断栈是否为空等核心操作。通过具体代码示例,展示了如何动态调整栈的大小以适应不同需求,并提供了一个测试主程序来验证栈操作的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、stack.h

#pragma once
#include<stdio.h>

#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 3	//定义栈的初始化大小
#define STACKINCREMENT 1	//定义栈每次内存增加的大小

typedef int Status;	//处理状态,TRUE 1,FALSE 0
typedef int ElemType;	//定义元素的类型

typedef struct {
	ElemType *base;//栈底指针
	ElemType *top;//栈顶指针
	int stacksize;//当前已分配的存储空间
}SqStack,* SqStack_p;

//初始化一个栈空间
Status InitStack(SqStack &s);

//入栈
Status Push(SqStack &s,ElemType e);

//出栈
Status Pop(SqStack &s, ElemType &e);

//获得栈顶元素
Status GetTop(SqStack s, ElemType &e);

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

2、stack.cpp

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

Status InitStack(SqStack &s) {
	s.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); //为栈分配内存
	if (!s.base) exit(0);
	s.top = s.base; //两指针指向同一地址
	s.stacksize = STACK_INIT_SIZE; //为栈容量赋值
	return TRUE;
}

Status Push(SqStack &s,ElemType e) {
	//当栈空间不足时
	if ((s.top - s.base) >= s.stacksize) {	//进入该语句的条件是,top指针已越界
		//realloc(要改变内存大小的指针名,新的大小)
		s.base = (ElemType *)realloc(s.base, (s.stacksize + STACKINCREMENT) * sizeof(ElemType));
		if (!s.base) exit(0);
		s.top = s.base + s.stacksize;	 //由于top指针已越界,而有重新分配的内存空间,所以要top也指向新的内存地址
		s.stacksize += STACKINCREMENT;	//为栈容量赋值
	}
	*(s.top++) = e; //先参与赋值,再指针再加一
	return TRUE;
}

Status Pop(SqStack &s, ElemType &e) {
	if (s.top > s.base) {
		e = *(--s.top); //先参与赋值,再指针再减一
		return TRUE;
	}
	return FALSE;
}

Status GetTop(SqStack s, ElemType &e) {
	if (s.top > s.base) {
		e = *(s.top - 1); //不需要top--
		return TRUE;
	}
	return FALSE;
}

Status StackEmpty(SqStack s) {
	if (s.top == s.base) {
		return TRUE;
	}
	return FALSE;
}

3、TestMain.cpp

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"Stack.h"

int main() {
	SqStack s;
	InitStack(s);
	printf("栈为空%d\n",StackEmpty(s));
	
	int data;
	printf("输入一组将要入栈的值,形如 1 2 3 4 5 a(以任意字母结尾)\n");
	while (scanf_s("%d", &data)!=0) {
		Push(s,data);
	}
	GetTop(s, data);
	printf("Top = %d\n", data);
	while (s.top-s.base > 0) {
		Pop(s, data);
		printf("Pop = %d\t", data);
	}
	return 0;
}

4、运行结果在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值