LeetCode232题栈实现队列
题目描述
使用栈实现队列的下列操作:
push(x) – 将一个元素放入队列的尾部。
pop() – 从队列首部移除元素。
peek() – 返回队列首部的元素。
empty() – 返回队列是否为空。
示例:
MyQueue queue = new MyQueue();
queue.push(1);
queue.push(2);
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false
说明:
你只能使用标准的栈操作 – 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。
解题思路
定义两个栈,一个入口栈pushst,该栈只进元素,一个出口栈popst,该栈只出元素
进元素时,直接在入口栈pushst中压栈进元素
出元素时,先判断出口栈popst中是否有元素,只有当出口栈popst为空时,才能将入口栈pushst中的元素导入出口栈中,再按正常出栈顺序将出口栈popst中的元素输出,即完成队列先进先出的特点
代码实现
// 支持动态增长的栈
typedef struct TreeNode* STDataType;
typedef struct Stack
{
STDataType* _a;
int _top; // 栈顶
int _capacity; // 容量
}Stack;
void StackInit(Stack* ps)
{
assert(ps);
ps->_a = NULL;
ps->_capacity = 0;
ps->_top = 0;
}
void StackDestory(Stack* ps)
{
assert(ps);
free(ps->_a);
ps->_a = NULL;
ps->_capacity = 0;
ps->_top = 0;
}
void StackPush(Stack* ps, STDataType x)
{
assert(ps);
if (ps->_top == ps->_capacity)
{
size_t newcapacity = ps->_capacity == 0 ? 4 : ps->_capacity * 2;
ps->_a = (STDataType*)realloc(ps->_a, sizeof(STDataType)*newcapacity);
assert(ps->_a != NULL);
ps->_capacity = newcapacity;
}
ps->_a[ps->_top] = x;
ps->_top++;
}
void StackPop(Stack* ps)
{
assert(ps && ps->_top > 0);
--ps->_top;
}
STDataType StackTop(Stack* ps)
{
assert(ps && ps->_top > 0);
return ps->_a[ps->_top - 1];
}
int StackEmpty(Stack* ps)
{
assert(ps);
return ps->_top == 0 ? 0 : 1;
}
int StackSize(Stack* ps)
{
assert(ps);
return ps->_top;
}
typedef struct {
Stack pushst;//定义一个入口栈,该栈只进元素
Stack popst; //定义一个出口栈,该栈只出元素
} MyQueue;
/** Initialize your data structure here. */
MyQueue* myQueueCreate(int maxSize) {
MyQueue* queue = (MyQueue*)malloc(sizeof(MyQueue));
StackInit(&queue->pushst);
StackInit(&queue->popst);
return queue;
}
/** Push element x to the back of queue. */
void myQueuePush(MyQueue* obj, int x) {
StackPush(&obj->pushst,x); //在入口栈中进元素
}
/** Removes the element from in front of queue and returns that element. */
int myQueuePop(MyQueue* obj) {
//判断出口栈是否为空,若为空才能将入口栈中的元素导入出口栈
if(StackEmpty(&obj->popst) == 0)
{
while(StackEmpty(&obj->pushst) != 0)
{
StackPush(&obj->popst,StackTop(&obj->pushst));
StackPop(&obj->pushst);
}
}
int top = StackTop(&obj->popst);//取栈顶元素
StackPop(&obj->popst);
return top;
}
/** Get the front element. */
int myQueuePeek(MyQueue* obj) {
if(StackEmpty(&obj->popst) == 0)
{
while(StackEmpty(&obj->pushst) != 0)
{
StackPush(&obj->popst,StackTop(&obj->pushst));
StackPop(&obj->pushst);
}
}
return StackTop(&obj->popst);
}
/** Returns whether the queue is empty. */
bool myQueueEmpty(MyQueue* obj) {
return StackEmpty(&obj->pushst) + StackEmpty(&obj->popst) == 0 ? true : false;
}
void myQueueFree(MyQueue* obj) {
StackDestory(&obj->pushst);
StackDestory(&obj->popst);
free(obj);
}