队列,栈的理解与例题

1.队列与栈的实现

 

1.1队列的实现

     队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。

 直接上代码:

#pragma once
#define QuNodeDataType int 
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

typedef struct QuNode
{
	struct QuNode* next;
	QuNodeDataType data;
}QuNode;

typedef struct Queue
{
	QuNode* head;
	QuNode* tail;
	int size;
}Queue;

void QueueInit(Queue* obj);

void QueueDestroy(Queue* obj);

void QueuePush(Queue* obj, QuNodeDataType x);

void QueuePop(Queue* obj);

Queue.c

#include"Queue.h"


void QueueInit(Queue* obj)
{
	assert(obj);

	obj->head = obj->tail = NULL;
	obj->size = 0;
}

void QueueDestroy(Queue* obj)
{
	assert(obj);
	while (obj->head)
	{
		QuNode* cur = obj->head->next;
		free(obj->head);
		obj->head = cur;
	}
	obj->head = obj->tail = NULL;
	obj->size = 0;
}

void QueuePush(Queue* obj, QuNodeDataType x)
{
	assert(obj);
	QuNode* newnode = (QuNode*)malloc(sizeof(QuNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}
	newnode->next = NULL;
	newnode->data = x;
	if (obj->head == NULL)
	{
		obj->head = obj->tail = newnode;
	}
	else
	{
		obj->tail->next = newnode;
		obj->tail = newnode;
	}
	obj->size++;
}

void QueuePop(Queue* obj)
{
	assert(obj);
	assert(obj->head);
	if (obj->head->next != NULL)
	{
		QuNode* next = obj->head->next;
		free(obj->head);
		obj->head = next;
		obj->size--;
	}
	else
	{
		free(obj->head);
		obj->head = obj->tail = NULL;
		obj->size--;
	}
}

2.1栈的实现

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。
直接上代码:

Stack.h
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
#define STDataType int
typedef struct stack
{
	STDataType* a;
	int top;
	int capecity;
}ST;

void STDestory(ST* p);
void STInit(ST* p);
void STPush(ST* p,STDataType a);
void STPop(ST* p);
int STSize(ST* p);
bool STEmpty(ST* p);
STDataType STTopData(ST* p);
Stack.c
#include"stack.h"


void STInit(ST* p)
{
	p->a=(STDataType*)malloc(4*sizeof(ST));
	p->capecity = 4;
	p->top = 0;
}


void STDestory(ST* p)
{
	assert(p);
	free(p->a);
	p->a = NULL;
	p->capecity = 0;
	p->top = 0;
}


void STPush(ST* p,STDataType a)
{
	assert(p);
	if (p->top == p->capecity)
	{
		STDataType* temp=(STDataType*)realloc(p,sizeof(p->capecity*2*sizeof(STDataType)));
		if (temp == NULL)
		{
			perror("realloc fail");
			return;
		}
		p->a = temp;
	}
	p->a[p->top] = a;
	p->top++;
}

void STPop(ST* p)
{
	assert(p);
	assert(!STEmpty(p));
	p->top--;
}


int STSize(ST* p)
{
	return p->top;
}


bool STEmpty(ST* p)
{
	assert(p);
	return p->top == 0;
}

STDataType STTopData(ST* p)
{
	assert(p);
	assert(!STEmpty(p));
	return p->a[p->top-1];
}

2.栈与队列的相关题目

学会了栈和队列的实现

我们就需要通过题目来强化对他们的理解和灵活的运用

难度: *   1. 括号匹配问题。OJ链接
难度:*** 2. 用队列实现栈。OJ链接
难度:*** 3. 用栈实现队列。OJ链接
难度:**  4. 设计循环队列。OJ链接        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值