数据结构_C语言链表构造栈和队列

本文介绍如何使用C语言的链表结构来实现栈和队列的基本操作,包括10进制数转换为n进制数的栈应用及链式存储的队列实现。通过具体代码示例,深入浅出地讲解了这两种数据结构的特点和使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据结构_C语言链表构造栈和队列

0.闲话

​ 才开始学数据结构,写点笔记,加深理解。

​ 栈和队列是数据结构的基础,很多算法都会基于这两个结构,比如dfs基于栈和bfs基于队列。

​ 栈和队列可以用链表构造,也可以用数组构造,我这里是用链表构造,并且是没有长度的

​ 编写语言:C

​ 编写环境:vc++6.0

1.栈

(1)大致意思

​ 其实和汇编语言的堆栈是一个意思,先进后出,后进先出。这里只是用高级语言封装一个PUSH函数和POP函数。

​ 用链表尾表示栈底,链表头表示栈顶。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n0CmWhgU-1585237921085)(E:/Typora/image/1585224994955.png)]

(2)栈:实现10进制转n进制

​ 这里我就直接贴源码了。可以字节尝试写一下,中间PUSH和POP的过程就参照上图。

#include<stdio.h>
#include<stdlib.h>
typedef struct q
{
	int data;
	struct q* link;
}Q;

//第二个参数可以是任意数据,或者是已知的一个结构体的首地址。
Q* PUSH(Q* head,int DATA)
{
	Q* HEAD;
	HEAD = (Q*)malloc(sizeof(Q));
	
	HEAD->data = DATA;
	HEAD->link = head;
	
	return HEAD;
}

Q* POP(Q* head)
{	
	Q* old_head;
	if(head->link == NULL)
		printf("The stack is empty!");
	else 
	{
		printf("%d",head->data);
		old_head = head;
		head = head->link;
		free(old_head);
	}
	return head;
}

int main()
{
	int n,m;
	int a;//´æ·ÅÓàÊý
	
	//先构造一个假想的空堆栈
	Q* head;
	head = (Q*)malloc(sizeof(Q));
	head->link = NULL;

	
	printf("please input n: ");
	scanf("%d",&n);	
	printf("please input a number: ");
	scanf("%d",&m);
	
	//要先明白10进制转n进制的原理
	while(m != 0)
	{
		a = m%n;
		head = PUSH(head , a);
		m /= n;
	}

	while(head->link != NULL)
	{
		head = POP(head);
	}
	putchar('\n');
		
	return 0;
}

2.队列

(1)大致意思

​ 类似食堂排队,先排的人先打到饭,然后出队,后排的人在后面跟着,这就是队列的核心先进先出,后进后出 。实现进队 EnQueue和出队OutQueue。

​ 所以,其实和链表存储差不多,只是要注意要特别注意先进先出即可。

​ 如果用链表实现的话。那链表头就是队首,链表尾就是队尾。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kM4CqK2I-1585237921087)(E:/Typora/image/1585230242729.png)]

(2)队列:实现链式存储

​ 哎,写的时候才发现,队列用结构体很麻烦,还不如直接用指针数组,或者直接用数组来的方便。。。。但是既然觉得了要用链表,还是写完吧。。。

#include<stdio.h>
#include<stdlib.h>
typedef struct q
{
	int data;
	struct q* link;
}Q;

//第二个参数可以是任意要用于入队的数据。
Q* EnQueue(Q* end,int DATA)
{
	Q* END;
	END = (Q*)malloc(sizeof(Q));
	
	end->link = END;

	END->data = DATA;
	
	//让所有有数据的结构体的link不为NULL。	
	END->link =	(Q*)malloc(sizeof(Q));
	(END->link)->link = NULL;//这里使队尾指向NULL

	return END;
}

Q* OutQueue(Q* head)
{	
	Q* HEAD;
	if(head->link != NULL)
	{	
		printf("%d\n",head->data);
		HEAD = head->link;
		free(head);
		return HEAD;
	}
	else
	{
		printf("The queue is empty!\n");
		return head;
	}
}

	
int main()
{	
	
	int n;
	
	Q* head;
	Q* end;
	
	head = NULL;
	

	printf("please input n:");
	scanf("%d",&n);

	end = (Q*)malloc(sizeof(Q));//建立一个空队列
	end->link = NULL;
	head = end;

	end = EnQueue(end , n);
	head = end;//第一次入队,要建立队首。

	for(n -= 1; n>0 ; n--)
		end = EnQueue(end , n);
	
	do
		head = OutQueue(head);
	while(head->link != NULL);
	
	return 0;
}	


大家看了有什么不对或是觉得我写的不好的地方,希望大家留言交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值