你好,欢迎来到我的博客!作为一名程序员,我经常刷LeetCode题目来提升自己的编程能力。在我的博客里,我会分享一些我自己做过的题目和解题思路,希望能够帮助到大家。今天,我想和大家分享一道挑战性较高的题目,让我们一起来挑战一下吧!作者也是在学习的过程中刷到有意思的题目就会选择与大家分享,并且提供较优解,关于力扣的文章全部放在博客,如果大家喜欢记得支持作者。🤓
题目难度:简单
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 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(双端队列)来模拟一个栈,只要是标准的栈操作即可。
示例一:
输入:
[“MyQueue”, “push”, “push”, “peek”, “pop”, “empty”]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 1, 1, false]
解释:
MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false
提示:
1 <= x <= 9
最多调用 100 次 push、pop、peek 和 empty
假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)
解题思路💡
总结:栈是先进后出,队列是先进先出,用两个栈实现队列,我们可以定义一个专门入数据的栈,再定义一个专门出数据的栈,入数据就在入数据的栈中入,出数据时,如果出数据的栈为空,将入数据的栈顶内容依次入到出数据的栈中,这样出数据的栈中的数据就是反过来的,再将此栈中的栈顶数据出栈。直到出数据的栈为空,再将入数据的栈中的数据再入栈到出数据的栈中,就达到了先入先出的效果。
- 本题需要先写一个功能完全的栈,然后对栈进行调用。
示例
第一步)
- 写出一个
栈
,有基本的初始化、入栈、出栈、销毁等功能。
(第二步)由上图中可以了解到
- 调用栈函数模拟实现队列功能。
代码实现⭐
typedef int STDataType; typedef struct STNode { STDataType* str; int top; int capacity; }STNode; void STInit(STNode* pst) { assert(pst); pst->str = NULL; pst->top = 0; pst->capacity = 0; } bool STEmpty(STNode* pst) { assert(pst); return pst->top == 0; } void STPush(STNode* pst, STDataType data) { assert(pst); if (pst->top == pst->capacity) { int Newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2; STDataType* temp =(STDataType*)realloc(pst->str,sizeof(STDataType) * Newcapacity); if (temp == NULL) { perror("malloc error"); return; } pst->str = temp; pst->capacity = Newcapacity; } pst->str[pst->top++] = data; } void STPop(STNode* pst) { assert(pst); assert(!STEmpty(pst)); pst->top--; } void STDestroy(STNode* pst) { assert(pst); free(pst->str); pst->top = 0; pst->capacity = 0; } STDataType STTop(STNode* pst) { assert(pst); assert(!STEmpty(pst)); return pst->str[pst->top - 1]; } typedef struct { STNode* STPushStack; STNode* STPopStack; } MyQueue; MyQueue* myQueueCreate() { MyQueue* mq = (MyQueue*)malloc(sizeof(MyQueue)); mq->STPushStack = (STNode*)malloc(sizeof(STNode)); STInit(mq->STPushStack); mq->STPopStack = (STNode*)malloc(sizeof(STNode)); STInit(mq->STPopStack); return mq; } void myQueuePush(MyQueue* obj, int x) { assert(obj); STPush(obj->STPushStack,x); } bool myQueueEmpty(MyQueue* obj) { assert(obj); return obj->STPushStack->top==0&&obj->STPopStack->top==0; } int myQueuePop(MyQueue* obj) { assert(obj); assert(!myQueueEmpty(obj)); if(obj->STPopStack->top==0) { while(obj->STPushStack->top!=0) { STDataType temp = STTop(obj->STPushStack); STPop(obj->STPushStack); STPush(obj->STPopStack,temp); } } STDataType ret = STTop(obj->STPopStack); STPop(obj->STPopStack); return ret; } int myQueuePeek(MyQueue* obj) { assert(obj); assert(!myQueueEmpty(obj)); if(obj->STPopStack->top==0) { while(obj->STPushStack->top!=0) { STDataType temp = STTop(obj->STPushStack); STPop(obj->STPushStack); STPush(obj->STPopStack,temp); } } return STTop(obj->STPopStack); } void myQueueFree(MyQueue* obj) { assert(obj); STDestroy(obj->STPushStack); STDestroy(obj->STPopStack); obj->STPushStack = NULL; obj->STPopStack = NULL; } /** * Your MyQueue struct will be instantiated and called as such: * MyQueue* obj = myQueueCreate(); * myQueuePush(obj, x); * int param_2 = myQueuePop(obj); * int param_3 = myQueuePeek(obj); * bool param_4 = myQueueEmpty(obj); * myQueueFree(obj); */
完结
当你喜欢一篇文章时,点赞、收藏和关注是最好的支持方式。如果你喜欢我的文章,请不要吝啬你的支持,点赞👍、收藏⭐和关注都是对我最好的鼓励。感谢你们的支持!