提神醒脑!!!
【题目描述】
链接:原题链接
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)
实现 MyStack 类:
- void push(int x) 将元素 x 压入栈顶。
- int pop() 移除并返回栈顶元素。
- int top() 返回栈顶元素。
- boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
【思路分析】:创立两个队列,一个实现入栈,一个实现出栈。
- 入栈:push数据到不为空的队列。
- 出栈:把不为空的队列的数据前N - 1导入另一个空队列,最后剩下的一个数据删掉。
本质:保持一个队列存储数据,另一个队列空着,要出栈时,空队列用来倒数据。
队列实现代码示例:
typedef int QDataType;
//typedef struct QueueNode
//{
// QDataType data;
// struct QueueNode* next;
//}QNode, *PNode;
typedef struct QueueNode
{
QDataType data;
struct QueueNode* next;
}QNode;
typedef struct Queue
{
QNode* head;
QNode* tail;
//size_t size;
}Queue;
void QueueInit(Queue* pq);
void QueueDestory(Queue* pq);
void QueuePush(Queue* pq, QDataType x);
void QueuePop(Queue* pq);
bool QueueEmpty(Queue* pq);
size_t QueueSize(Queue* pq);
QDataType QueueFront(Queue* pq);
QDataType QueueBack(Queue* pq);
void QueueInit(Queue* pq){
assert(pq);
pq->head = NULL;
pq->tail = NULL;
}
void QueueDestory(Queue* pq){
assert(pq);
QNode * cur = pq->head;
while (cur)
{
QNode * Next = cur->next;
free(cur);
cur = NULL;
cur = Next;
}
pq->head = pq->tail = NULL;
}
void QueuePush(Queue* pq, QDataType x){
assert(pq);
QNode * newnode = (QNode *)malloc(sizeof(QNode));
if (!newnode)
{
printf("malloc fail\n");
exit(-1);
}
else{
if (pq->tail == NULL)
{
assert(pq->head == NULL);
pq->head = pq->tail = newnode;
newnode->data = x;
newnode->next = NULL;
}
else
{
pq->tail->next = newnode;
newnode->data = x;
newnode->next = NULL;
pq->tail = newnode;
}
}
}
void QueuePop(Queue* pq){
assert(pq);
assert(pq->head && pq->tail);
if (pq->head->next == NULL)
{
free(pq->head);
pq->head = pq->tail = NULL;
}
else{
QNode* Next = pq->head->next;
free(pq->head);
pq->head = Next;
}
}
bool QueueEmpty(Queue* pq){
assert(pq);
return pq->head == NULL && pq->tail == NULL;
}
size_t QueueSize(Queue* pq){
assert(pq);
size_t count = 0;
QNode* cur = pq->head;
while (cur)
{
count++;
cur = cur->next;
}
return count;
}
QDataType QueueFront(Queue* pq){
assert(pq);
assert(pq->head);
return pq->head->data;
}
QDataType QueueBack(Queue* pq){
assert(pq);
assert(pq->tail);
return pq->tail->data;
}
用队列实现栈代码示例:
typedef struct {
Queue q1;
Queue q2;
} MyStack;
MyStack* myStackCreate() {
MyStack* pst = (MyStack * )malloc(sizeof(MyStack));
assert(pst);
QueueInit(&(pst->q1));
QueueInit(&(pst->q2));
return pst;
}
void myStackPush(MyStack* obj, int x) {
assert(obj);
if(!QueueEmpty(&obj->q1)){
QueuePush(&obj->q1, x);
}
else{
QueuePush(&obj->q2, x);
}
}
int myStackPop(MyStack* obj) {
assert(obj);
Queue* emptyQ = &obj->q1;
Queue* nonemptyQ = &obj->q2;
if(!QueueEmpty(&obj->q1))
{
emptyQ = &obj->q2;
nonemptyQ = &obj->q1;
}
//把非空队列的前N-1个数据导入空列表
while(QueueSize(nonemptyQ) > 1){
int front = QueueFront(nonemptyQ);
QueuePush(emptyQ, front);
QueuePop(nonemptyQ);
}
int top = QueueFront(nonemptyQ);
QueuePop(nonemptyQ);
return top;
}
int myStackTop(MyStack* obj) {
assert(obj);
if(!QueueEmpty(&obj->q1)){
return QueueBack(&obj->q1);
}
else{
return QueueBack(&obj->q2);
}
}
bool myStackEmpty(MyStack* obj) {
assert(obj);
return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);
}
void myStackFree(MyStack* obj) {
assert(obj);
QueueDestory(&obj->q1);
QueueDestory(&obj->q2);
free(obj);
}
若有不同意见,欢迎小伙伴们指出,评论区讨论 ,谢谢大家!