408-王道-栈的链式存储

在这里插入图片描述

1.操作菜单

在这里插入图片描述

2.初始化

  1. 注意初始化的要给下一个结点赋值为NULL
void init(LinkNodeStack& stack) {
	stack = (LinkNodeStack)malloc(sizeof(LinkNode));
	stack->nextNode = NULL;//这个地方必须得写,如果不写的话遍历的话,会指针越界
	return;
}

3.栈空

bool empty(LinkNodeStack stack) {
	return stack->nextNode == NULL;
}

4.进栈

void insert(LinkNodeStack& stack , ElemType data) {
	LinkNodeStack temp = stack->nextNode;
	LinkNodeStack node = (LinkNodeStack)malloc(sizeof(LinkNode));
	node->nextNode = NULL;
	node->data = data;
	if (temp == NULL) {
		stack->nextNode = node;
	}
	else {
		node->nextNode = stack->nextNode;
		stack->nextNode = node;
	}
}

5.出栈

  1. 注意出栈的时候剩余结点的个数。
  2. 注意删除的时候,将链表接起来。
bool delElem(LinkNodeStack &stack, ElemType  &getElemData) {
	LinkNodeStack temp = stack->nextNode;
	if (!empty(stack)) {
		if (temp->nextNode==NULL) {
			getElemData = temp->data;
			free(temp);
			stack->nextNode = NULL;
		}
		else {
			LinkNodeStack deleteNode = temp;
			temp->nextNode = deleteNode->nextNode;
			getElemData = deleteNode->data;
			//注意链表会断掉,
			stack->nextNode = deleteNode->nextNode;
			free(deleteNode);
		}
		return true;
	}
	else {
		return false;
	}
}

6.读取栈顶元素

bool getElemTop(LinkNodeStack stack,ElemType &getElemTop) {
	if (empty(stack)) {
		return false;
	}
	else {
		getElemTop = stack->nextNode->data;
		return true;
	}
}

7.栈的长度

int length(LinkNodeStack stack) {
	LinkNodeStack temp = stack->nextNode;
	int i = 0;
	while (temp!=NULL) {
		i++;
		temp = temp->nextNode;
	}
	return i;
}

8.查看栈

void printStack(LinkNodeStack stack) {
	LinkNodeStack temp =  stack->nextNode;
	int i = 0;
	while (temp != NULL) {
		printf("stack[%d] = %d\n", i++, temp->data);
		temp = temp->nextNode;
	}
}

9.完整代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<malloc.h>

typedef int ElemType;

typedef struct LinkNode {
	ElemType data;
	struct LinkNode *nextNode;
}LinkNode, *LinkNodeStack;
void choice(LinkNodeStack& stack);
void menu(LinkNodeStack& stack);
void init(LinkNodeStack& stack);
void insert(LinkNodeStack& stack, ElemType data);
void printStack(LinkNodeStack stack);
bool delElem(LinkNodeStack& stack);
bool empty(LinkNodeStack stack);
int getElemTop(LinkNodeStack stack);
int length(LinkNodeStack stack);
void menu(LinkNodeStack &stack) {
	printf("-----------------栈的顺序存储结构-----------------\n");
	printf("               1.初始化                          \n");
	printf("               2.栈空                            \n");
	printf("               3.进栈                            \n");
	printf("               4.出栈                            \n");
	printf("               5.读取栈顶元素                     \n");
	printf("               6.栈的长度                         \n");
	printf("               7.查看栈                          \n");
	choice(stack);
}
bool getElemTop(LinkNodeStack stack,ElemType &getElemTop) {
	if (empty(stack)) {
		return false;
	}
	else {
		getElemTop = stack->nextNode->data;
		return true;
	}
}
int length(LinkNodeStack stack) {
	LinkNodeStack temp = stack->nextNode;
	int i = 0;
	while (temp!=NULL) {
		i++;
		temp = temp->nextNode;
	}
	return i;
}
bool empty(LinkNodeStack stack) {
	return stack->nextNode == NULL;
}
bool delElem(LinkNodeStack &stack, ElemType  &getElemData) {
	LinkNodeStack temp = stack->nextNode;
	if (!empty(stack)) {
		if (temp->nextNode==NULL) {
			getElemData = temp->data;
			free(temp);
			stack->nextNode = NULL;
		}
		else {
			LinkNodeStack deleteNode = temp;
			temp->nextNode = deleteNode->nextNode;
			getElemData = deleteNode->data;
			//注意链表会断掉,
			stack->nextNode = deleteNode->nextNode;
			free(deleteNode);
		}
		return true;
	}
	else {
		return false;
	}
}
void init(LinkNodeStack& stack) {
	stack = (LinkNodeStack)malloc(sizeof(LinkNode));
	stack->nextNode = NULL;//这个地方必须得写,如果不写的话遍历的话,会指针越界
	return;
}
void insert(LinkNodeStack& stack , ElemType data) {
	LinkNodeStack temp = stack->nextNode;
	LinkNodeStack node = (LinkNodeStack)malloc(sizeof(LinkNode));
	node->nextNode = NULL;
	node->data = data;
	if (temp == NULL) {
		stack->nextNode = node;
	}
	else {
		node->nextNode = stack->nextNode;
		stack->nextNode = node;
	}
}
void printStack(LinkNodeStack stack) {
	LinkNodeStack temp =  stack->nextNode;
	int i = 0;
	while (temp != NULL) {
		printf("stack[%d] = %d\n", i++, temp->data);
		temp = temp->nextNode;
	}
}
void choice(LinkNodeStack& stack) {
	int choice = 0;
	int len;

	ElemType insertData;
	ElemType getElemTopData;
	ElemType getDeleteData;

	bool isEmpty;
	bool isGetElem;
	bool getTopData;

	printf("请输入你的选择:");
	scanf("%d", &choice);

	switch (choice) {
	case 1:
		init(stack);
		printf("初始化完成\n");
		break;
	case 2:
		isEmpty = empty(stack);
		printf(isEmpty == true ? "栈空\n" : "栈不空\n");
		break;
	case 3:
		printf("请输入你要添加的值:");
		scanf("%d", &insertData);
		insert(stack, insertData);
		break;
	case 4: {
		isGetElem = delElem(stack, getDeleteData);
		if (isGetElem) {
			printf("出栈成功\n");
			printf("取出的元素为:%d\n", getDeleteData);
		}
		else {
			printf("读取失败\n");
		}
		break;
	}
	case 5: {
		getTopData = getElemTop(stack, getElemTopData);
		if (getTopData) {
			printf("读取成功\n");
			printf("读取的元素为%d\n", getElemTopData);
		}
		else {
			printf("读取失败\n");
		}
	
		break;
	}
	case 6:
	
		len = length(stack);
		printf("长度为%d\n",len);
		break;
	case 7:
		printStack(stack);
		break;
	}

	menu(stack);

}

int main() {
	LinkNodeStack stack;
	menu(stack);
	return 0;
}

10.思想

  1. 和单链表类似,只是这里的出栈变成了单链表的删除操作,而且每次删除的是头结点后面的一个结点
  2. 其他的功能点都和单链表差不多。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
王道数据结构书中讨论了的链存储的实现。链存储结构是一种常见的的实现方。在链存储结构中,的每个元素都是一个节点,节点中包含了数据元素和指向下一个节点的指针。通过将节点按照特定的方连接起来,形成一个链表的结构,从而实现了的功能。 在链存储结构中,的插入和删除操作都是在链表的头部进行的,即将新的节点插入到链表的头部作为顶元素,或者将链表的头部节点删除作为顶元素出。这种方的好处是插入和删除操作的时间复杂度都是O(1),即常数时间,因为只需要修改链表的指针即可。而在顺序存储结构中,插入和删除操作的时间复杂度是O(n),需要移动其他元素。 在王道数据结构书中,可能会对链存储结构的实现进行详细的介绍,包括节点的定义、插入和删除操作的具体步骤等。如果你需要更详细的信息,建议参考相关章节的内容。<span class="em">1</span> #### 引用[.reference_title] - *1* [王道数据结构+C语言版+超全笔记(图文)+个人整理版本](https://download.csdn.net/download/weixin_44071580/85079507)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值