严蔚敏《数据结构》——链栈

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

/*链栈*/
#include<cstdio>
#include<cstdlib>
#define STACK_INIT_SIZE 100	
#define STACKINCREMENT	10
#define SElenType int
#define Status int
typedef struct LStack {
	SElenType data;
	struct  LStack* next;
 }LStack,*LStackList;

栈的初始化

Status InitStack(LStackList& S) {
	S = new LStack;
	S->next = NULL;
	return 0;
}

创建栈

Status Creat(LStackList &S,int n) {
	InitStack(S);//初始化栈
	int i;
	for (i = 0; i < n; i++) {
		int e;
		scanf_s("请输入一个元素:%d", e);
		Push(S, e);
	}
	printf("新栈创建成功!\n");
}

入栈操作

Status Push(LStackList& S, SElenType e) {
	LStackList p = new LStack;//生成新的节点
	p->data = e;//新节点的数据赋值
	p->next = S;//新节点的指针指向头节点
	S = p;//更新栈顶元素为新插入的元素
	printf("元素%d入栈成功!\n", e);
	return 0;
}

出栈操作

Status Pop(LStackList& S, SElenType e) {
	if (!S->next) {
		printf("这是一个空栈!\n");
		return 0;
	}
	LStackList p = S;
	S = S->next;
	free(p);
	printf("元素%d出栈成功!\n", e);
}

取栈顶元素

Status GetTop(LStackList& S, SElenType e) {
	if (StackEmpty(S)) {//判空
		printf("这是一个空栈!\n");
			return 0;
	}
	e = S->data;
	printf("该栈的栈顶元素是:%d\n", e);
	return 0;
}

 查询栈中的元素个数(栈长)

Status StackLength(LStackList S) {
	LStackList p = S;//p指向栈顶元素
	int count = 0;
	while (p) {
		p = p->next;
		count++;
	}
	printf("该栈内元素个数为:%d\n", count);
	return 0;
}

判断栈是否非空

bool StackEmpty(LStackList S) {
	if (S->next == NULL) {
		printf("这是一个空栈!\n");
		return true;
	}
	printf("这不是一个空栈!\n");
	return false;
}

栈置空

Status ClearStack(LStackList& S) {
	if (S->next != NULL) S->next = NULL;
	printf("栈的置空操作成功!\n");
		return 0;
}

销毁栈

Status DestoryStack(LStackList& S) {
	LStackList p = S;
	LStackList pre = new LStack;
	//判空,可以调用StackEmpty(LStackList S)方法
	if (p->next = NULL) printf("这是一个空栈!\n"); exit(OVERFLOW);
	while (p->next) {
		pre = p;
		p = p->next;
		delete(pre);
	}
	printf("栈销毁成功!/n");
	return 0;
}

查找元素e在栈中的位序

Status LocateElem(LStackList S, SElenType e) {
	LStackList p = S->next;//初始化,p指向第一个结点
	int j = 1;//计数 
	int flag = 0;//判断该元素是否在栈中
	while (p != NULL) {
		if(p->data=e){
			flag = 1;
			break;
		}
		p = p->next;
		j++;
	}
	if(!flag){
		printf("该栈中没有要查找到元素!\n");
	}
	else {
		printf("该元素%d在栈中的位序是:%d", e, j);
	}
}
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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爷傲|奈我何

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

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

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

打赏作者

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

抵扣说明:

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

余额充值