示例 1:
输入:
[“MyStack”, “push”, “push”, “top”, “pop”, “empty”]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 2, 2, false]
解释:
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False
提示
好,看完题目的描述,我们来分析一下去求解这道题目
typedef struct {
Qu q1;
Qu q2;
} MyStack;
MyStack* myStackCreate() {
MyStack* myStack = (MyStack *)malloc(sizeof(MyStack));
QueueInit(&(myStack->q1));
QueueInit(&(myStack->q2));
return myStack;
}
可能还是有同学对这个结构不太能想象地出来,这里给出它的结构图
//只往非空的队列中入数据
if(!QueueEmpty(&obj->q1))
QueuePush(&obj->q1,x);
else
QueuePush(&obj->q2,x);
Qu* EmptyQu = &obj->q1;
Qu* nonEmptyQu = &obj->q2;
if(!QueueEmpty(&obj->q1))
{ //必定是一个空,一个非空
EmptyQu = &obj->q2;
nonEmptyQu = &obj->q1;
}
//首先将非空队列中的前n-1个元素都出队
while(QueueSize(nonEmptyQu) > 1)
{
QueuePush(EmptyQu,QueueFront(nonEmptyQu)); //每次取出非空队列的头元素
QueuePop(nonEmptyQu); //出队队头元素
}
//此时非空队列中还剩一个元素,取出return即可
int front = QueueFront(nonEmptyQu);
QueuePop(nonEmptyQu); //然后将此元素出队
return front;
//返回非空队列的末尾元素
if(!QueueEmpty(&obj->q1))
return QueueBack(&obj->q1);
else
return QueueBack(&obj->q2);
typedef int QDataType;
typedef struct QueueNode {
QDataType data;
struct QueueNode* next;
}QNode;
typedef struct Queue {
QNode* front;
QNode* rear;
size_t sz;
}Qu;
/*初始化队列*/
void QueueInit(Qu* q);
/*销毁队列*/
void QueueDestroy(Qu* q);
/*入队*/
void QueuePush(Qu* q, QDataType x);
/*获取队头*/
QDataType QueueFront(Qu* q);
/*获取队尾*/
QDataType QueueBack(Qu* q);
/*出队*/
void QueuePop(Qu* q);
/*判空*/
bool QueueEmpty(Qu* q);
/*求解队列大小*/
size_t QueueSize(Qu* q);
//---------------------------------
typedef struct {
Qu q1;
Qu q2;
} MyStack;
MyStack* myStackCreate() {
MyStack* obj = (MyStack *)malloc(sizeof(MyStack));
QueueInit(&(obj->q1));
QueueInit(&(obj->q2));
return obj;
}
void myStackPush(MyStack* obj, int x) {
//只往非空的队列中入数据
if(!QueueEmpty(&obj->q1))
QueuePush(&obj->q1,x);
else
QueuePush(&obj->q2,x);
}
int myStackPop(MyStack* obj) {
Qu* EmptyQu = &obj->q1;
Qu* nonEmptyQu = &obj->q2;
if(!QueueEmpty(&obj->q1))
{ //必定是一个空,一个非空
EmptyQu = &obj->q2;
nonEmptyQu = &obj->q1;
}
//首先将非空队列中的前n-1个元素都出队
while(QueueSize(nonEmptyQu) > 1)
{
QueuePush(EmptyQu,QueueFront(nonEmptyQu)); //每次取出非空队列的头元素
QueuePop(nonEmptyQu); //出队队头元素
}
//此时非空队列中还剩一个元素,取出return即可
int front = QueueFront(nonEmptyQu);
QueuePop(nonEmptyQu); //然后将此元素出队
return front;
}
int myStackTop(MyStack* obj) {
//返回非空队列的末尾元素
if(!QueueEmpty(&obj->q1))
return QueueBack(&obj->q1);
else
return QueueBack(&obj->q2);
}
bool myStackEmpty(MyStack* obj) {
return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);
}
void myStackFree(MyStack* obj) {
QueueDestroy(&obj->q1);
QueueDestroy(&obj->q2);
free(obj);
}
//---------------------------------
/*初始化队列*/
void QueueInit(Qu* q)
{
q->front = NULL;
q->rear = NULL;
q->sz = 0;
}
/*销毁队列*/
void QueueDestroy(Qu* q)
{
assert(q);
QNode* cur = q->front;
while (cur)
{
QNode* del = cur;
cur = cur->next;
free(del);
//del = NULL; 无需再将del置为空,因为其为局部变量不会被访问到
}
q->front = q->rear = NULL; //头尾指针要置空
}
/*入队*/
void QueuePush(Qu* q, QDataType x)
{
assert(q);
/*创建结点初始化*/
QNode* newNode = (QNode*)malloc(sizeof(QNode));
if (newNode == NULL)
{
perror("fail malloc");
exit(-1);
}
newNode->data = x;
newNode->next = NULL;
/*尾插*/
if (q->rear == NULL)
{ //队列为空
q->front = q->rear = newNode;
}
else
{
q->rear->next = newNode;
q->rear = newNode;
}
q->sz++; //结点个数 + 1
}
/*出队*/
void QueuePop(Qu* q)
{
assert(q);
assert(!QueueEmpty(q));
//1.只有一个结点
if (q->front == q->rear)
{
free(q->front);
q->front = q->rear = NULL;
}
//2.有多个结点
else
{
QNode* del = q->front;
q->front = q->front->next;
free(del);
}
q->sz--;
}
/*获取队头*/
QDataType QueueFront(Qu* q)
{
assert(q);
assert(!QueueEmpty(q));
return q->front->data;
}
/*获取队尾*/
QDataType QueueBack(Qu* q)
{
assert(q);
assert(!QueueEmpty(q));
return q->rear->data;
}
/*判空*/
bool QueueEmpty(Qu* q)
{
assert(q);
return q->front == NULL && q->rear == NULL;
}
/*求解队列大小*/
size_t QueueSize(Qu* q)
{
return q->sz;
}
/**
* Your MyStack struct will be instantiated and called as such:
* MyStack* obj = myStackCreate();
* myStackPush(obj, x);
* int param_2 = myStackPop(obj);
* int param_3 = myStackTop(obj);
* bool param_4 = myStackEmpty(obj);
* myStackFree(obj);
*/
class MyStack {
public:
queue<int> q1;
queue<int> q2;
MyStack() {
}
void push(int x) {
q1.push(x);
}
int pop() {
int sz = q1.size();
sz--; //先让总长度减1,少出队一个元素
while(sz--)
{ //将sz - 1个元素先放入q2中暂时保存
q2.push(q1.front());
q1.pop();
}
int ret = q1.front(); //此时q1中只剩一个元素,出队即为FILO
q1.pop();
//重置q1
q1 = q2;
while(!q2.empty())
{ //清空q2
q2.pop();
}
return ret; //放在最后返回是因为在获取q1队首元素后要pop()掉,否则队列中会有剩余元素
}
int top() {
return q1.back();
}
bool empty() {
return q1.empty();
}
};
/**
* Your MyStack object will be instantiated and called as such:
* MyStack* obj = new MyStack();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->top();
* bool param_4 = obj->empty();
*/
class MyStack {
public:
queue<int> qu;
MyStack() {
}
void push(int x) {
qu.push(x);
}
int pop() {
int sz = qu.size();
sz--;
while(sz--)
{
//将队头元素置为队尾元素,执行sz - 1此
qu.push(qu.front());
qu.pop();
}
//此时的出队顺序即为出栈的顺序
int ret = qu.front();
qu.pop();
return ret; //此处return 是因为最后执行时需要先将队列中元素清除再返回,否则队列不为空
}
int top() {
return qu.back();
}
bool empty() {
return qu.empty();
}
};
/**
* Your MyStack object will be instantiated and called as such:
* MyStack* obj = new MyStack();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->top();
* bool param_4 = obj->empty();
*/
以上就是本文所要描述的所有内容,感谢您对本文的观看,如有疑问请于评论区留言或者私信我都可以