数据结构:(c实现)手把手教你实现栈和队列(内附详细代码)

目录:

一:栈

(1)栈的基本概念(物理图解)

(2)栈的基本结构以及初始化

(3)栈的基本接口函数(入栈与出栈)

 二:队列

(1)基本概念与图解

(2)基本接口函数的实现

一:栈

(1)栈的基本概念(物理图解)

在标准规定里,栈是一种特殊的线性表,有栈底和栈顶两端,规定它只能从栈顶出入数据,所以这也是栈的一个基本原则:先入栈的后出栈(后入栈先出栈)我们在实现一个栈时,通常使用顺序表来实现,以顺序表的表尾来做栈顶

数据结构:(c实现)手把手教你实现栈和队列(内附详细代码)_第1张图片

例如上面的一个栈,栈底的位置一直不改变从栈顶进一个数据(指向栈顶的指针加一),然后又从栈顶出一个数据(指向栈顶的指针减一)。

(2)栈的基本结构以及初始化

typedef int Stack_data_type;
#define Maxca 10

typedef struct Stack
{
	Stack_data_type * St;
	int top;
	int capacity;
}stack;


//栈初始化
void Stack_init(stack* ps)
{
	ps->capacity = Maxca;
	ps->top = 0;
	ps->St = (Stack_data_type*)malloc(ps->capacity * sizeof(Stack_data_type));
}

在栈的初始化时,top指针初始值设置为0,每次添加数据后,top++,所以top一直指向着栈内最后一个数据的下一个数据节点。(图解如下)

数据结构:(c实现)手把手教你实现栈和队列(内附详细代码)_第2张图片

(3)栈的基本接口函数(入栈与出栈)

//入栈
void Stack_push(stack* ps, Stack_data_type x)
{
	ps->St[ps->top] = x;
	ps->top++;
	if (ps->top == ps->capacity)
	{
		Stack_data_type* ptr = (Stack_data_type*)realloc(ps->St, ps->capacity * 2 * sizeof(Stack_data_type));
		if (ptr == NULL)
		{
			perror(realloc);
		}
		else
		{
			ps->St = ptr;
			ps->capacity *= 2;
		}
	}
}

//出栈
Stack_data_type Stack_pop(stack* ps)
{
	if (ps->top == 0)
	{
		printf("栈已经清空\n");
		exit(-1);
	}
	else
	{
		ps->top--;
		printf("出栈%d \n", ps->St[ps->top]);
		return  ps->St[ps->top];
	}
}

这里需要注意的是,当栈慢的时候需要自动开辟新的空间。还有在对栈进行出栈操作时,要判断top是否为0,当top为0时,代表栈已经清空了。

 二:队列

(1)基本概念与图解

队列:基本概念,该结构只能从一端入数据,另一端出数据。所以这也是队列的特殊属性,先入队列的数据先出队列,后入队列的数据后出队列。(先进先出,后进后出)

数据结构:(c实现)手把手教你实现栈和队列(内附详细代码)_第3张图片

在实现这种结构时,一般推荐使用单链表。定义两个指针去维护这个单链表,一个指向表头,一个指向表尾。有数据入队列时就尾插,出数据就头删。并且将指向头位置的指针向后移动一位。 

(2)基本接口函数的实现

#define _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"

//初始化
void Queue_init(que* ps)
{
	ps->head = ps->tail = NULL;
}

//入队
void Queue_push(que* ps, Queue_data_type x)
{
	assert(ps);
	Queue* newnode = (Queue*)malloc(sizeof(Queue));
	newnode->data = x;
	newnode->next = NULL;
	if (ps->head == NULL)
	{//说明此时还没有节点
		ps->head = ps->tail = newnode;
	}
	else
	{
		ps->tail->next = newnode;
		ps->tail = newnode;
	}
}

//出队
Queue_data_type Queue_pop(que* ps)
{
	assert(ps);
	assert(ps->head);
	Queue_data_type tmp =0;
	Queue* cur = NULL;
	if (ps->head->next == NULL)
	{
		tmp = ps->head->data;
		free(ps->head);
		return tmp;
	}
	else
	{
		tmp = ps->head->data;
		cur = ps->head->next;
		free(ps->head);
		ps->head =cur;
		return tmp;
	}
}

//打印栈
void Queue_Prin(que* ps)
{
	Queue* cur = ps->head;
	assert(ps && ps->head);
	while (cur)
	{
		printf("%d ", cur->data);
		cur = cur->next;
	}
	printf("\n");
}

//释放队列
void Queue_release(que* ps)
{
	assert(ps && ps->head);
	Queue* cur = ps->head;
	Queue* next = cur->next;
	while (cur->next)
	{
		free(cur);
		cur = next;
		next = next->next;
	}
	free(cur);
}

你可能感兴趣的:(链表,数据结构)