四:链式栈的实现(附带运行截图,亲测有效)

 一:基本操作代码如下:

链式栈和带头结点的单链表很像,只是栈要遵循“先进后出”的基本原则,而且只能在一端进行插入和删除操作。

#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct Link_StackNode
{
	ElemType data;//数据域
	struct Link_StackNode* next;//指针域
} Link_StackNode, * LinkStack;

//初始化
bool Init_LinkStack(LinkStack& top) {
	top = (Link_StackNode*)malloc(sizeof(Link_StackNode));
	if (top == NULL)  return false;
	top->next = NULL;//设置栈顶指针为空
	return true;
}

//判空
bool LinkedStack_Empty(LinkStack top) {
	if (top->next == NULL)  return true;
	else  return false;
}

//入栈
bool Push_LinkStack(LinkStack& top, ElemType x) {
	LinkStack p = (Link_StackNode*)malloc(sizeof(Link_StackNode));
	if (p == NULL) {    //申请新结点空间失败
		return false;
	}
	else {
		p->data = x;
		p->next = top;
		top = p;    //让头结点指针城指向新的栈顶元素
				printf("%d ", x);
		return true;
	}
}

//求栈长,即存放了几个元素(和单链表求表长几乎一个道理)
int Length_LinkedStack(LinkStack top) {
	int count = 0;
	while (top->next != NULL) {
		top = top->next;
		count++;
	}
	return count;
}

//出栈
bool Pop_LinkStack(LinkStack& top, ElemType& x) {
	if (top == NULL) {//判空
		return false;
	}
	else {
		Link_StackNode* p = top;       //定义一个新结点
		x = p->data;     //将原来栈顶数据元素存放至新结点空间
		top = p->next;    //top指向下一个结点
		free(p);       //释放新结点所占的空间
		return true;
	}
}

//取栈顶元素
int GetTop_LinkStack(LinkStack top)
{
	if (top->next == NULL)  return 0;
	return top->next->data;
}

//打印栈中元素
void Printf_LinkStack(LinkStack top) {
	LinkStack p = top;
	while (p->next) {
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");
}

//主函数
int  main() {
	LinkStack top;
	Init_LinkStack(top);

	printf("请输入一系列元素如11 22 33 44 55 -1且以-1结束:\n");
	int x;
	scanf_s("%d", &x);
	while (x != -1) {
		Push_LinkStack(top, x);
		scanf_s("%d", &x);
	}
	printf("\n");

	int len= Length_LinkedStack(top);
	printf("栈的长度为:%d\n",len);

	printf("打印栈中元素:\n");
    Printf_LinkStack(top);

	return 0;
}

二:运行截图:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值