2.2 链栈

这一章是关于链栈的代码实现。
链栈的数据结构:

/*链栈结点的数据结构*/
typedef struct StackNode{
	ElemType data;							//数据域
	struct StackNode* next;					//指针域
}StackNode, * ListStack;

主要函数如下:

  1. bool Push(ListStack& S, ElemType e) 功能:入栈;
    参数:S:栈, e:入栈的元素;
    时间复杂度:O(1);
  2. bool Pop(ListStack& S, ElemType& e) 功能:出栈,出栈元素赋值给e;
    参数:S:栈, e:出栈的元素;
    时间复杂度:O(1);
  3. bool GetTop(ListStack& S, ElemType& e) 功能:取栈顶元素并返回,不改变栈的元素;
    参数:S:栈, e:储存取得的栈顶元素;
    时间复杂度:O(1);
  4. void PrintListStack(ListStack S) 功能:从栈顶到栈底输出所有元素;
    参数:S:栈;
    时间复杂度:O(n);

完整代码:

#include<cstdio>
#include<cstdlib>
#include<iostream>

#define ElemType int
/*--------------------------------------------数据结构部分--------------------------------------------*/

/*链栈结点的数据结构*/
typedef struct StackNode{
	ElemType data;							//数据域
	struct StackNode* next;					//指针域
}StackNode, * ListStack;

void InitStack(ListStack& S) {
	S = NULL;
}

/*入栈*/
bool Push(ListStack& S, ElemType e) {
	StackNode* p;
	p = new StackNode;
	p->data = e;      
	p->next = S;     
	S = p;
	return true;
}

/*出栈*/
bool Pop(ListStack& S, ElemType& e) {
	ListStack p;
	if (S == NULL)							//判断是否栈空		
		return false;
	e = S->data;
	p = S;
	S = S->next;
	free(p);								//释放结点
	return true;
}

/*取栈顶元素*/
bool GetTop(ListStack& S, ElemType& e) {
	if (S == NULL)							//判断是否栈空
		return false;
	e = S->data;
	return true;
}

/*从栈顶到栈底输出所有元素*/
void PrintListStack(ListStack S) {
	int sum = 0;
	StackNode* p = S;
	if (!p)
		printf("栈空\n");
	else {
		printf("栈顶->栈底:\n");
		while (p)
		{
			sum++;
			printf("%d ",p->data);
			p = p->next;
		}
		printf("共有%d个元素", sum);
	}


}

/*--------------------------------------------功能函数部分--------------------------------------------*/
void menu() {
	printf("\n\n");
	printf("----------①创建链栈----------\n");
	printf("----------②  入栈  ----------\n");
	printf("----------③  出栈  ----------\n");
	printf("----------④ 取栈顶 ----------\n");
	printf("----------⑤ 打印栈 ----------\n");
	printf("按“0”退出\n");
	printf("\n\n");
}

/*创建链栈功能*/
void CreateListStack(ListStack& S) {
	InitStack(S);
	int n, i = 0;
	ElemType e;
	printf("输入创建的栈的元素个数:\n");
	scanf("%d", &n);
	printf("逐个输入栈的元素:\n");
	while (i < n)
	{
		scanf("%d", &e);
		Push(S, e);
		i++;
	}
}

/*入栈功能*/
void PushToStack(ListStack& S) {
	ElemType e;
	printf("输入要入栈的元素:\n");
	scanf("%d", &e);
	if (Push(S, e)) {
		printf("入栈成功!\n");
	}
	else {
		printf("入栈失败,栈已满!");
	}
}

/*出栈功能*/
void PopFromStack(ListStack& S) {
	ElemType e;
	if (Pop(S, e)) {
		printf("%d出栈成功!\n", e);
	}
	else
		printf("栈空,出栈失败!\n");
}

/*取栈顶元素功能*/
void GetTopStack(ListStack S) {
	ElemType e;
	if (GetTop(S, e))
		printf("取栈顶成功!栈顶元素为%d\n", e);
	else
		printf("取栈顶失败!栈空\n");
}

int main() {
	ListStack S;
	int choice;
	do
	{
		menu();
		scanf("%d", &choice);
		switch (choice)
		{
		case(1):
			CreateListStack(S);
			break;
		case(2):
			PushToStack(S);
			break;
		case(3):
			PopFromStack(S);
			break;
		case(4):
			GetTopStack(S);
			break;
		case(5):
			PrintListStack(S);
			break;
		default:
			break;
		}
	} while (choice != 0);

	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值