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

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、运行结果在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构(C语言)》严蔚敏、吴伟民+课本算法源码与习题解析 其中算法源码与解析涵盖了《数据结构》课本和习题集两部分,.所有源码实现均使用C语言,遵循C99标准,使用C-Free 5(C-Free置gcc编译器,编译时,需要在菜单栏,定位到构建-->构建选项-->类别-->C Language,勾选第三个:"ISO C99 plus GNU extensions [-std=gnu99]",即编译选项用-std=gnu99,而不是-std=c89或者-std=c99)测试通过(不要在CFree里创建工程,如果确实想在工程里运行,那文件互相引用的方式需要改写)。为了便于引用、查阅,各章内容在计算机中分文件夹存放,其中,《▲课本算法实现》中存放对课本中算法的实现,《▼配套习题解析》存放对题集中习题的解答,各源文件按章、节组织,组织方式见附录二。 《数据结构》(C语言)是为“数据结构”课程编写的教材,也可作为学习数据结构及其算法的C程序设计的参数教材。 本书的前半部分从抽象数据类型的角度讨论各种基本类型的数据结构及其应用;后半部分主要讨论查找和排序的各种实现方法及其综合分析比较。其内容和章节编排1992年4月出的《数据结构》(第二)基本一致,但在本书中更突出了抽象数据类型的概念。全书采用类C语言作为数据结构和算法的描述语言。 本书概念表述严谨,逻辑推理严密,语言精炼,用词达意,并有配套出的《数据结构题集》(C语言),便于教学,又便于自学。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值