严蔚敏《数据结构》——顺序栈

严奶奶版数据结构,我用C写一直报错,后来发现C中没有引用,只有指针。为了还原原版的味道.这里创建了.cpp的文件,加上了#include<cstdio>和#include<cstdlib>两个头文件,来还原原汁原味的严奶奶版数据结构中的算法。

/*顺序栈*/
#include<cstdio>
#include<cstdlib> 
#define SElemType int 
#define Status int 
#define STACK_INIT_SIZE 100	//初始空间分配量
#define STACKINCREMENT	10		//存储空间分配增量 

//using namespace std;
//栈的结构
typedef struct {
	SElemType* base;	//栈底指针,在栈结构不存在(构造之前和销毁之后),base的值为NULL
	SElemType* top;		//栈顶指针,非空栈的栈顶指针始终在栈顶元素的的下一个位置上 
	int stacksize;		//可存储的最大容量,即最多存储的元素个数 
}SqStack;

栈的结构

Status InitStack(SqStack& S) {
	S.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
	if (!S.base) {
		printf("动态空间分配失败!\n");
			exit(OVERFLOW);
	}
	S.top = S.base;//栈顶元素=栈底元素
	S.stacksize = STACK_INIT_SIZE;//栈存储空间
	printf("顺序栈初始化成功!\n");
	return 0;
}

销毁栈

Status DestroyStack(SqStack& S) {
	free(S.base);
	S.base = NULL;
	S.top = NULL;
	S.stacksize = 0;
	printf("此栈销毁成功!\n");
	return 0;
}

取栈的栈顶元素并用e返回该值

Status GetTop(SqStack S, SElemType& e) {
	if (S.top == S.base) printf("这是一个空栈!\n"); return 0;
	e = *(S.top - 1);
	printf("该栈的栈顶元素是:%d", e);
	return 0;
}

插入元素e为新的栈顶元素(入栈操作)

Status Push(SqStack& S, SElemType e) {
	if (S.top - S.base > S.stacksize) {//栈满追加存储空间
		S.base = (SElemType*)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));
		if (!S.base) printf("动态存储空间分配失败!\n"); exit(OVERFLOW);
		S.top = S.base + S.stacksize;
		S.stacksize += STACKINCREMENT;//更新栈的最大容量
	}
	*S.top++ = e;
	printf("插入新栈顶元素成功!\n");
	return 0;
}

删除栈顶元素并用e返回该值

Status Pop(SqStack& S, SElemType e) {
	if (S.top = S.base) printf("该栈为空栈!\n"); exit(OVERFLOW);//判断栈是否非空
	e = *--S.top;
	printf("删除栈顶元素成功!\n");
	return 0;
}

 查找栈中的元素个数

Status StackLength(SqStack& S) {
	int count = S.top - S.base;
	return count;
}

判断栈是否非空

bool StackEmpty(SqStack& S) {
	if (S.base == S.top) {
		printf("此栈为空!\n");
		return true;
	}
	else {
		printf("此栈不为空!\n");
		return false;
	}
}

置空栈

Status ClearStack(SqStack& S) {
	S.top = S.base;
	printf("置空操作成功!\n");
	return 0;
}

栈遍历输出(先进后出)

Status StackTraverse(SqStack& S) {
	printf("开始遍历!\n");
	for (SElemType* i = S.base; i < S.top; i++) {
		printf("%d", *i);
	}
	printf("\n");
	return 1;
}
int main() {
	/*此处省略10000字*/
}

main交给各位写了,我实现了没有问题的,有问题的请联系我。

学艺不精,若有错误还请多多指教,谢谢。

p.s.在使用Visual Studio编译器的时候输入scanf()方法要用scanf_s()

更多内容请移步公众号 手撕算法。谢谢

算法爱好者协会群:940100543,加入学习讨论。

所使用编译器为:Visual Studio2019 链接:https://pan.baidu.com/s/1eg8CNrqrP1jn7GRzHfYXxA
                                                                    提取码:1234

推荐新手使用dev cpp                        链接:https://pan.baidu.com/s       /1XZp_8lVE7X6tMLmvXRbYhw
                                                                     提取码:1234

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爷傲|奈我何

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值