[Leetcode]用栈实现队列

用栈实现队列:

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false

1.题解:

通过两个栈的配合实现队列的基本功能,下面先实现栈的基本功能

栈: (前面文章介绍过栈的实现,这里就不过多阐述)

typedef int StackDataType;
typedef struct Stack {
	StackDataType* head;
	int capacity;
	int size;
}Stack;
//创建栈
Stack* StackCreate() {
	Stack* tmp = (Stack*)malloc(sizeof(Stack));
	tmp->head = NULL;
	tmp->capacity = tmp->size = 0;
	return tmp;
}
//入栈
void StackPush(Stack*tmp,StackDataType x) {
	if (tmp->capacity == tmp->size) {
		int newcapacity = tmp->capacity == 0 ? 4 : 2 * tmp->capacity;
		StackDataType* cur = (StackDataType*)realloc(tmp->head, newcapacity * sizeof(StackDataType));
		if (cur == NULL) {
			perror("StackPush:malloc");
			exit;
		}
		tmp->head = cur;
		tmp->capacity = newcapacity;
	}
	tmp->head[tmp->size] = x;
	tmp->size++;
}
//出栈
StackDataType StackPop(Stack*tmp) {
	if (tmp->size == 0) {
		perror("StackPop:NULL");
		exit;
	}
	StackDataType s = tmp->head[tmp->size - 1];
	tmp->size--;
	return s;
}
//栈的销毁
void StackDestroy(Stack*tmp) {
	free(tmp->head);
	tmp->head = NULL;
	tmp->capacity = tmp->size = 0;
	free(tmp);
	tmp = NULL;
}

2.基于栈实现队列基本功能:

入队列:

根据上图思路,一个栈(stack1)存储数据,一个栈(stack2)出数据。

void myQueuePush(MyQueue* obj, int x) {
	assert(obj);
	StackPush(obj->stack1, x);
}
出队列:

出队列就涉及到判断出数据的那个栈(stack2)是否有数据(栈判空(StackEmpty))

int myQueuePop(MyQueue* obj) {
	assert(obj);
	if (obj->stack2->size == 0) {
		while (obj->stack1->size != 0) {
			StackPush(obj->stack2, StackPop(obj->stack1));
		}
	}
	return StackPop(obj->stack2);
}
返回队列顶部元素:

同样涉及判空问题,因为该功能仅和出队列少了最后删除元素

int myQueuePeek(MyQueue* obj) {
	assert(obj);
	if (obj->stack2->size == 0) {
		if (obj->stack1->size == 0) {
			perror("Peek:NULL");
			exit;
		}
		return obj->stack1->head[0];
	}
	return obj->stack2->head[obj->stack2->size - 1];
}
 判空:

stack1与stack2均为空

bool myQueueEmpty(MyQueue* obj) {
	assert(obj);
	return obj->stack1->size == 0 && obj->stack2->size == 0;
}

 3.完整代码:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef int StackDataType;
typedef struct Stack {
	StackDataType* head;
	int capacity;
	int size;
}Stack;
Stack* StackCreate() {
	Stack* tmp = (Stack*)malloc(sizeof(Stack));
	tmp->head = NULL;
	tmp->capacity = tmp->size = 0;
	return tmp;
}
void StackPush(Stack*tmp,StackDataType x) {
	if (tmp->capacity == tmp->size) {
		int newcapacity = tmp->capacity == 0 ? 4 : 2 * tmp->capacity;
		StackDataType* cur = (StackDataType*)realloc(tmp->head, newcapacity * sizeof(StackDataType));
		if (cur == NULL) {
			perror("StackPush:malloc");
			exit;
		}
		tmp->head = cur;
		tmp->capacity = newcapacity;
	}
	tmp->head[tmp->size] = x;
	tmp->size++;
}
StackDataType StackPop(Stack*tmp) {
	if (tmp->size == 0) {
		perror("StackPop:NULL");
		exit;
	}
	StackDataType s = tmp->head[tmp->size - 1];
	tmp->size--;
	return s;
}
void StackDestroy(Stack*tmp) {
	free(tmp->head);
	tmp->head = NULL;
	tmp->capacity = tmp->size = 0;
	free(tmp);
	tmp = NULL;
}
typedef struct Queue{
	Stack* stack1;
	Stack* stack2;
}MyQueue;

MyQueue* myQueueCreate() {
	MyQueue* queue = (MyQueue*)malloc(sizeof(MyQueue));
	queue->stack1 = StackCreate();
	queue->stack2 = StackCreate();
	return queue;
}

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

int myQueuePop(MyQueue* obj) {
	assert(obj);
	if (obj->stack2->size == 0) {
		while (obj->stack1->size != 0) {
			StackPush(obj->stack2, StackPop(obj->stack1));
		}
	}
	return StackPop(obj->stack2);
}

int myQueuePeek(MyQueue* obj) {
	assert(obj);
	if (obj->stack2->size == 0) {
		if (obj->stack1->size == 0) {
			perror("Peek:NULL");
			exit;
		}
		return obj->stack1->head[0];
	}
	return obj->stack2->head[obj->stack2->size - 1];
}

bool myQueueEmpty(MyQueue* obj) {
	assert(obj);
	return obj->stack1->size == 0 && obj->stack2->size == 0;
}

相关推荐

  1. leetcode-队列实现

    2024-04-22 05:42:01       37 阅读
  2. leetcode-实现队列

    2024-04-22 05:42:01       32 阅读
  3. LeetCode-232. 实现队列 设计 队列

    2024-04-22 05:42:01       32 阅读
  4. LeetCode255.队列实现

    2024-04-22 05:42:01       33 阅读
  5. LeetCode232:实现队列

    2024-04-22 05:42:01       19 阅读
  6. Leetcode225_队列实现

    2024-04-22 05:42:01       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-22 05:42:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-22 05:42:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-22 05:42:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-22 05:42:01       20 阅读

热门阅读

  1. 一文掌握面阵相机

    2024-04-22 05:42:01       13 阅读
  2. Ubuntu 中如何高效的使用grep命令

    2024-04-22 05:42:01       15 阅读
  3. Cordova Common Command

    2024-04-22 05:42:01       9 阅读
  4. Storm详细配置

    2024-04-22 05:42:01       11 阅读
  5. ELK 与 EFK的介绍和对比

    2024-04-22 05:42:01       12 阅读
  6. Cesium之汉化

    2024-04-22 05:42:01       14 阅读