目录
链接:
. - 力扣(LeetCode)
题目描述:
思路
push
假设我们在队列中放入10个数据,分别为1,2,3,4,5,6,7,8,9,10
那么在队列中第一个元素为1,而在栈中则为10
pop
移除栈顶元素,也就是移除10,我们只需要将存有元素的队列中前面的全部元素均push到另一个空的队列中即可,在另一个队列中顺序不变。
保持1,2,3,4,5,6,7,8,9
top
返回栈顶元素,和pop同样的思路,将前面的元素先全部打入空队列中,取出最后一个元素,先将他的值复制下来,之后再将该元素打入空队列即可
即:
取出1,2,3,4,5,6,7,8,9
拷贝10
push 10,得到1,2,3,4,5,6,7,8,9,10
empty
两个队列均为空指针则说明栈为空
代码
typedef int QDataType;
typedef struct QListNode
{
struct QListNode* _next;
QDataType _data;
}QNode;
// 队列的结构
typedef struct Queue
{
QNode* _front;
QNode* _rear;
}Queue;
// 初始化队列
void QueueInit(Queue* q);
// 队尾入队列
void QueuePush(Queue* q, QDataType data);
// 队头出队列
void QueuePop(Queue* q);
// 获取队列头部元素
QDataType QueueFront(Queue* q);
// 获取队列队尾元素
QDataType QueueBack(Queue* q);
// 获取队列中有效元素个数
int QueueSize(Queue* q);
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0
int QueueEmpty(Queue* q);
// 销毁队列
void QueueDestroy(Queue* q);
void QueueInit(Queue* q) {
q->_front = NULL;
q->_rear = NULL;
}
void QueuePush(Queue* q, QDataType data) {
QNode* tmp = (QNode*)malloc(sizeof(QNode));
if (tmp == NULL) {
perror("malloc error!\n");
return;
}
if (q->_front == NULL) {
q->_front = tmp;
q->_rear = tmp;
tmp->_data = data;
tmp->_next = NULL;
return;
}
q->_rear->_next = tmp;
tmp->_next = NULL;
tmp->_data = data;
q->_rear = tmp;
}
void QueuePop(Queue* q) {
if (q->_front == NULL) {
printf("no value!\n");
return;
}
if (q->_front == q->_rear) {
free(q->_front);
q->_front = q->_rear = NULL;
return;
}
QNode* tmp = q->_front->_next;
free(q->_front);
q->_front = tmp;
}
QDataType QueueFront(Queue* q) {
return q->_front->_data;
}
QDataType QueueBack(Queue* q) {
return q->_rear->_data;
}
int QueueSize(Queue* q) {
if (q->_front == NULL)
return 0;
int sum = 1;
QNode* tmp = q->_front;
while (tmp != q->_rear) {
tmp = tmp->_next;
sum++;
}
return sum;
}
int QueueEmpty(Queue* q) {
if (q->_front == NULL)
return 1;
return 0;
}
void QueueDestroy(Queue* q) {
if (q->_front == NULL)
return;
QNode* tmp = q->_front, * cur = tmp;
q->_front = q->_rear = NULL;
while (tmp) {
tmp = tmp->_next;
free(cur);
cur = tmp;
}
}
typedef struct {
Queue q1;
Queue q2;
} MyStack;
MyStack* myStackCreate() {
MyStack* ps = (MyStack*)malloc(sizeof(MyStack));
QueueInit(&(ps->q1));
QueueInit(&(ps->q2));
return ps;
}
void myStackPush(MyStack* obj, int x) {
if (!QueueEmpty(&(obj->q1)))
QueuePush(&(obj->q1), x);
else
QueuePush(&(obj->q2), x);
}
int myStackPop(MyStack* obj) {
Queue* empty = &(obj->q1);
Queue* nonempty = &(obj->q2);
if (!QueueEmpty(&(obj->q1))) {
nonempty = &(obj->q1);
empty = &(obj->q2);
}
while (QueueSize(nonempty) > 1) {
QueuePush(empty, QueueFront(nonempty));
QueuePop(nonempty);
}
int top = QueueFront(nonempty);
QueuePop(nonempty);
return top;
}
int myStackTop(MyStack* obj) {
if (!QueueEmpty(&(obj->q1))) {
return QueueBack(&(obj->q1));
}
return QueueBack(&(obj->q2));
}
bool myStackEmpty(MyStack* obj) {
return QueueEmpty(&(obj->q1)) && (QueueEmpty(&(obj->q2)));
}