[C/C++]数据结构 LeetCode:用栈实现队列

题目描述:

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

实现 MyQueue 类:

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

说明:

  • 只能 使用标准的栈操作 ------ 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

题目链接 :力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

功能思路:

在实现本题前,需要先构建好栈的基本功能,可以参考 :http://t.csdnimg.cn/Kha16

1.出队列 和 入队列

现在我们有两个栈,假设在第一个栈中依次入栈1 2 3 4 5,另一个为空栈

现在要出队列的话,应该把1出队,所以需要把除了栈底元素的其他元素出栈并且入到第二个栈里,这时就可以将1出队,但是将数据导入另一个栈时,数据会倒过来

如果要再次出队列的话,应该把2出队,就不需要把数据导一次了,直接栈顶出栈即可.

若此时再入队6 7的话,可以直接把6 7入到第一个栈中,因为出栈可以直接再第二个栈中操作

所以我们可以把将一个栈专门用来入数据,另一个栈专门用来出数据,每次出队之前先判断出数据的栈是否为空,如果出数据那个栈不为空的话,直接出数据即可,否则就将入数据的栈中的数据导入出数据的栈中,再出栈.

2.返回队列开头元素

如果出数据的栈不为空,栈顶元素即为队列开头元素,否则就需要将入数据的栈的元素导入出数据的栈中,在返回栈顶元素

3.判空

两个栈同时为空,说明队列为空

参考代码:

复制代码
typedef int STDataType;
typedef struct stack
{
	int* a;
	int top;
	int capacity;
}ST;

void STInit(ST* ps)
{
	assert(ps);

	ps->a = NULL;
	ps->capacity = 0;
	ps->top = 0;  //top初始化位0,top的值可以表示栈元素的个数
}

void STPush(ST* ps, STDataType x)
{
	assert(ps);
	//扩容
	if (ps->top == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		STDataType* ret = (STDataType*)realloc(ps->a,sizeof(STDataType)*newcapacity);
		if (ret == NULL)
		{
			perror("realloc");
			return;
		}
		ps->a = ret;
		ps->capacity = newcapacity;
	}
	ps->a[ps->top] = x;
	ps->top++;
}

void STPop(ST* ps)
{
	assert(ps);
	assert(ps->top);

	ps->top--;
}

STDataType STTop(ST* ps)
{
	assert(ps);
	assert(ps->top);

	return ps->a[ps->top - 1];
}

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

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

void STDestroy(ST* ps)
{
	assert(ps);

	free(ps->a);
	ps->a == NULL;
	ps->top = ps->capacity = 0;
}

typedef struct {
    ST Queuepush;
    ST Queuepop;
} MyQueue;


MyQueue* myQueueCreate() {
    MyQueue *obj=(MyQueue*)malloc(sizeof(MyQueue));
    STInit(&obj->Queuepush);
    STInit(&obj->Queuepop);
    return obj;
}

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

int myQueuePeek(MyQueue* obj) {
    if(STEmpty(&obj->Queuepop))
    {
        while(!STEmpty(&obj->Queuepush))
        {
            STPush(&obj->Queuepop,STTop(&obj->Queuepush));
            STPop(&obj->Queuepush);
        }
    }
    return STTop(&obj->Queuepop);
}

int myQueuePop(MyQueue* obj) {
    int front = myQueuePeek(obj);
    STPop(&obj->Queuepop);
    return front;
}

bool myQueueEmpty(MyQueue* obj) {
    return STEmpty(&obj->Queuepop)&&STEmpty(&obj->Queuepush);
}

void myQueueFree(MyQueue* obj) {
    STDestroy(&obj->Queuepop);
    STDestroy(&obj->Queuepush);
    free(obj);
}
相关推荐
Nil2082 分钟前
leetcode 189轮转数组
数据结构·算法·leetcode
嵌入式阿蔡1 小时前
CAN总线入门:从协议帧到STM32实战
c语言·stm32·单片机·嵌入式硬件·嵌入式实时数据库
码匠许师傅1 小时前
【C++ 面试真题】聊聊 C++ 中的 lambda 表达式
java·c++·面试
依然鸣1 小时前
PTA团体程序设计天梯赛L1真题讲解L1-085-088
数据结构·c++·经验分享·算法·深度优先·pat考试
沙盘客2 小时前
AFSIM 14篇 C++ 插件开发:扩展你的仿真能力
c++·后端
NeilYuen2 小时前
【vemory】高性能KV存储AOF方案设计
linux·c++·redis·缓存
Brilliantwxx2 小时前
【算法从零到千】【51-54】逆序对(分治+递归算法)
数据结构·算法·排序算法
LONGZETECH2 小时前
无人机组装调试实训高损耗痛点分析与虚拟仿真教学落地方案
c语言·开发语言·架构·无人机
小星星闪亮登场2 小时前
2026河南萌新联赛第四场--南阳理工学院
数据结构·算法·贪心算法·动态规划·哈希算法·广度优先
土司大王2 小时前
LeetCode hot100——两数之和
数据结构·算法·leetcode