IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 栈与队列的3个oj题 -> 正文阅读

[数据结构与算法]栈与队列的3个oj题


225.用队列实现栈

在这里插入图片描述

解题思路

队列的性质是先进的先出,栈的性质是先进是后出。
我们设计的这两个队列,当添加数据的时候,插入有数据不为空的一个队列。当删除数据的,把数据移动到为空的队列中去,只留下队尾的数据,该数据就是要删除的数据。

代码

下面这是创建队列

typedef int QueueTypeDate;

typedef struct QListNode
{
	struct QListNode* next;
	QueueTypeDate val;
}QNode;

typedef struct Queue
{
	QNode* head;
	QNode* tail;
}Queue;

void QueueInit(Queue* q)
{
	assert(q);
	q->head = q->tail = NULL;
}

bool QueueEmpty(Queue* q)
{
	assert(q);

	return q->head == NULL;
}

void QueuePush(Queue* q, QueueTypeDate x)
{
	assert(q);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	newnode->next = NULL;
	newnode->val = x;

	if (QueueEmpty(q))
		q->head = q->tail = newnode;
	else
	{
		q->tail->next = newnode;
		q->tail = newnode;
	}
}
void QueuePop(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));
	if (q->head == q->tail)
	{
		free(q->head);
		q->head = q->tail = NULL;
	}
	else
	{
		QNode* next = q->head->next;
		free(q->head);
		q->head = next;
	}
	
}
QueueTypeDate QueueFront(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));

	return q->head->val;
}
QueueTypeDate QueueBack(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));

	return q->tail->val;
}
int QueueSize(Queue* q)
{
	assert(q);
	QNode* cur = q->head;
	int size = 0;
	while (cur)
	{
		size++;
		cur = cur->next;
	}
	return size;
}
void QueueDestroy(Queue* q)
{
	assert(q);
	while (q->head)
	{
		QueuePop(q);
	}
}

队列实现栈

typedef struct {
    Queue Q1;
    Queue Q2;
} MyStack;


MyStack* myStackCreate() {
    MyStack* obj=(MyStack*)malloc(sizeof(MyStack));
    QueueInit(&obj->Q1);
    QueueInit(&obj->Q2);
    return obj;
}

void myStackPush(MyStack* obj, int x) {
    if(QueueEmpty(&obj->Q1))
    QueuePush(&obj->Q2,x);
    else
    QueuePush(&obj->Q1,x);
}

int myStackPop(MyStack* obj) {
    int x;
    if(QueueEmpty(&obj->Q1))
    {
        while((&obj->Q2)->head!=(&obj->Q2)->tail)
        {
            x=QueueFront(&obj->Q2);
            QueuePop(&obj->Q2);
            QueuePush(&obj->Q1,x);
        }   
        x=QueueFront(&obj->Q2);
        QueuePop(&obj->Q2);    
    }
    else
    {
        while((&obj->Q1)->head!=(&obj->Q1)->tail)
        {
            x=QueueFront(&obj->Q1);
            QueuePop(&obj->Q1);
            QueuePush(&obj->Q2,x);
        }   
        x=QueueFront(&obj->Q1);
        QueuePop(&obj->Q1);       
    }
    return x;
}

int myStackTop(MyStack* obj) {
    if(QueueEmpty(&obj->Q1))
    return QueueBack(&obj->Q2);
    else
    return QueueBack(&obj->Q1);
}

bool myStackEmpty(MyStack* obj) {
    return QueueEmpty(&obj->Q1)&&QueueEmpty(&obj->Q2);
}

void myStackFree(MyStack* obj) {
    QueueDestroy(&obj->Q1);
    QueueDestroy(&obj->Q2);
    free(obj);
}

232.用栈实现队列

在这里插入图片描述

解题思路

一个栈来表示入队(简称入栈),另一个栈来表示出队(简称出栈)。当出队是,如果出栈为空,入栈里面的全部数据进入出栈中。
当查看队头的元素的时候,就是要察看出栈栈顶的数据。要注意出栈数据为空的情况。

代码

栈的实现——》数据结构——栈

typedef struct {
    Stack outstack;
    Stack instack;
} MyQueue;


MyQueue* myQueueCreate() {
    MyQueue* obj=(MyQueue*)malloc(sizeof(MyQueue));
    InitStack(&obj->outstack);
    InitStack(&obj->instack);
    return obj;
}

void myQueuePush(MyQueue* obj, int x) {
    StackPush(&obj->instack,x);
}

int myQueuePop(MyQueue* obj) {
    if(!StackSize(&obj->outstack))
    {
        while(StackSize(&obj->instack))
        {
            StackPush(&obj->outstack,StackTop(&obj->instack));
            StackPop(&obj->instack);
        }
    }
    int x=StackTop(&obj->outstack);
    StackPop(&obj->outstack);
    return x;
}

int myQueuePeek(MyQueue* obj) {
    if(!StackSize(&obj->outstack))
    {
        while(StackSize(&obj->instack))
        {
            StackPush(&obj->outstack,StackTop(&obj->instack));
            StackPop(&obj->instack);
        }
    }
    return StackTop(&obj->outstack);
}

bool myQueueEmpty(MyQueue* obj) {
    return !(StackSize(&obj->instack)||StackSize(&obj->outstack));
}

void myQueueFree(MyQueue* obj) {
    StackDestroy(&obj->outstack);
    StackDestroy(&obj->instack);
    free(obj);

}

622.设计循环队列

在这里插入图片描述

解题思路

我们创建的循环队列为静态。队列长度为N,那么我们里面只用来储存N-1个数据。
队列里面的成员包括,数据,队列起始下标(头标),队列末尾下标(尾标),队列可以有效储存数据的长度。
我们这样设计循环队列:当头标和尾标相等时,队列为空;当尾标下一个坐标等于头标时,为满。
在这里插入图片描述
我们设计的队列本质是连续储存的数组。
当增加数据的时候,尾向后移动;当删除数据的时候,头向后走。
不为空的时候。头或尾到最后的边界的时候,要回到头的地方。
插入的时候注意满的情况,删除的时候注意为空的时候。

代码

typedef struct {
    int* arr;
    int head;
    int tail;
    int capacity;
} MyCircularQueue;


MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    obj->arr=(int*)malloc(sizeof(int)*(k+1));
    obj->head=obj->tail=0;
    obj->capacity=k;
    return obj;
}

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    return obj->head==obj->tail;
}

bool myCircularQueueIsFull(MyCircularQueue* obj) {
    int curtail=obj->tail+1;
    if(curtail==obj->capacity+1)
    curtail=0;
    return curtail==obj->head;
}

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    if(myCircularQueueIsFull(obj))
    return false;
    obj->arr[obj->tail]=value;
    obj->tail++;
    if(obj->tail==obj->capacity+1)
    obj->tail=0;
    return true;
}

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
    return false;
    obj->head++;
    if(obj->head==obj->capacity+1)
    obj->head=0;
    return true;
}

int myCircularQueueFront(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
    return -1;
    return obj->arr[obj->head];
}

int myCircularQueueRear(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
    return -1;
    int curtail=obj->tail-1;
    if(curtail==-1)
    return obj->arr[obj->capacity];
    else
    return obj->arr[curtail];
}

void myCircularQueueFree(MyCircularQueue* obj) {
    free(obj->arr);
    obj->arr=NULL;
    free(obj);

}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-24 18:28:41  更:2022-05-24 18:30:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:36:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码