题目描述:
使用栈实现队列的下列操作:
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 操作)
先把需要用到的栈构建好:C语言实现一个动态栈
思路分析:
1.使用两个栈来完成对队列的模拟 2.一个栈用来辅助中转元素,一个栈主要用来存放数据 3.入队操作全部对于s1进行,出队操作首先将s1中的元素压入s2,然后s2的栈顶就是队头,将值保存后删除,然后再把s2的元素全部转入s1,恢复原本的结构 4.获取队头元素和出队操作一致,只是不删除s2的栈顶元素即可
代码实现:
typedef struct
{
Stack s1
;
Stack s2
;
} MyQueue
;
MyQueue
* myQueueCreate()
{
MyQueue
* SQ
=(MyQueue
*)malloc(sizeof(MyQueue
));
if(SQ
==NULL)
{
assert(0);
}
StackInit(&SQ
->s1
);
StackInit(&SQ
->s2
);
return SQ
;
}
void myQueuePush(MyQueue
* obj
, int x
)
{
StackPush(&obj
->s1
,x
);
}
int myQueuePop(MyQueue
* obj
)
{
while(obj
->s1
.top
>0)
{
StackPush(&obj
->s2
,StackTop(&obj
->s1
));
StackPop(&obj
->s1
);
}
int a
=StackTop(&obj
->s2
);
StackPop(&obj
->s2
);
while(obj
->s2
.top
>0)
{
StackPush(&obj
->s1
,StackTop(&obj
->s2
));
StackPop(&obj
->s2
);
}
return a
;
}
int myQueuePeek(MyQueue
* obj
)
{
while(obj
->s1
.top
>0)
{
StackPush(&obj
->s2
,StackTop(&obj
->s1
));
StackPop(&obj
->s1
);
}
int a
=StackTop(&obj
->s2
);
while(obj
->s2
.top
>0)
{
StackPush(&obj
->s1
,StackTop(&obj
->s2
));
StackPop(&obj
->s2
);
}
return a
;
}
bool myQueueEmpty(MyQueue
* obj
)
{
if(StackEmpty(&obj
->s2
) == -1 && StackEmpty(&obj
->s1
) == -1)
{
return true;
}
return false;
}
void myQueueFree(MyQueue
* obj
)
{
free(obj
);
obj
=NULL;
}