- 使用栈实现队列的下列操作:
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 操作)。
typedef int STDataType;
typedef struct Stack
{
STDataType* _a;
int _top; // 栈顶
int _capacity; // 容量
}Stack;
Stack ps;
void StackInit(Stack* ps){
assert(ps);
ps->_a = NULL;
ps->_top = 0;
ps->_capacity = 0;
}
void StackDestory(Stack* ps){
assert(ps);
free(ps->_a);//
ps->_a = NULL;
ps->_top = 0;
ps->_capacity = 0;
}
void StackPush(Stack* ps, STDataType x){
assert(ps);
if (ps->_top == ps->_capacity)
{
int newcapacity = ps->_capacity==0?4:2 * (ps->_capacity);//
ps->_a= (STDataType*)realloc(ps->_a, newcapacity*sizeof(STDataType));
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);
if (ps->_top == 0){
return 0;
}
else{
return 1;
}
}
int StackSize(Stack* ps){
assert(ps);
return ps->_top;
}
typedef struct {
Stack inst;
Stack outst;
} MyQueue;
MyQueue que;
/** Initialize your data structure here. */
MyQueue* myQueueCreate(int maxSize) {
MyQueue* que = (MyQueue*)malloc(sizeof(MyQueue)*maxSize);
StackInit(&que->inst);
StackInit(&que->outst);
return que;
}
/** Push element x to the back of queue. */
void myQueuePush(MyQueue* obj, int x) {
StackPush(&obj->inst);
}
/** Removes the element from in front of queue and returns that element. */
int myQueuePop(MyQueue* obj) {
if (StackEmpty(&obj->outst)!=0){
int front = StackTop(&obj->outst);
StackPop(&obj->outst);
return front;
}
else{
while (StackEmpty(&obj->inst)!=0){
StackPush(&obj->outst,StackTop(&obj->inst));
StackPop(&obj->outst);
}
int front = StackTop(&obj->outst);
StackPop(&obj->outst);
return front;
}
/** Get the front element. */
int myQueuePeek(MyQueue* obj) {
if (StackEmpty(&obj->outst)!=0){
int front = StackTop(&obj->outst);
return front;
}
else{
while (StackEmpty(&obj->inst)!=0){
StackPush(&obj->outst,StackTop(&obj->inst));
StackPop(&obj->outst);
}
int front = StackTop(&obj->outst);
return front;
}
}
/** Returns whether the queue is empty. */
bool myQueueEmpty(MyQueue* obj) {
return StackEmpty(&obj->inst)==0 && StackEmpty(&obj->outst)==0;
}
void myQueueFree(MyQueue* obj) {
StackDestory(&obj->inst);
StackDestory(&obj->outst);
}
/**
* Your MyQueue struct will be instantiated and called as such:
* struct MyQueue* obj = myQueueCreate(maxSize);
* myQueuePush(obj, x);
* int param_2 = myQueuePop(obj);
* int param_3 = myQueuePeek(obj);
* bool param_4 = myQueueEmpty(obj);
* myQueueFree(obj);
*/