用栈实现队列

232. 用栈实现队列 - 力扣(LeetCode) (leetcode-cn.com)


相似题目——用队列实现栈

LeetCode刷题(7)【栈&队列】用队列实现栈(C语言)_半生瓜のblog-CSDN博客


思路

image-20210614164351913

用栈实现队列要比用队列实现栈要简单一些,我们不用来回在两个栈里面导数据,只需要导一次,然后在依次出栈就成功实现队列的出队操作了。

image-20210614164357870

image-20210614165007351

结论

  1. 入数据往push栈里面入
  2. 出数据从pop栈里面出,如果里面有数据,直接出,没有就把push栈里面的数据导过来,然后再出。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
typedef int StackDataType;
typedef struct Stack
{
StackDataType* arry;
int top;//指向栈顶
int capacity;//栈的容量——能放几个数据
}Stack;
//初始化
void StackInit(Stack* ps)
{
assert(ps);
ps->arry = (StackDataType*)malloc(sizeof(StackDataType)*4);
if (ps->arry == NULL)
{
printf("malloc fail");
exit(-1);
}
ps->capacity = 4;
ps->top = 0;
}
//销毁
void StackDestory(Stack* ps)
{
assert(ps);
free(ps->arry);
ps->arry = NULL;
ps->top = ps->capacity =0 ;
}
//入栈
void StackPush(Stack* ps, StackDataType x)
{
assert(ps);
//满了
if (ps->top == ps->capacity)
{
StackDataType* tmp = (StackDataType*)realloc(ps->arry, ps->capacity * 2 * sizeof(StackDataType));
if (tmp == NULL)
{
printf("realloc fail");
exit(-1);
}
else
{
ps->arry = tmp;
ps->capacity *= 2;
}
}
ps->arry[ps->top] = x;
ps->top++;
}
//出栈
void StackPop(Stack* ps)
{
assert(ps);
//如果栈空了调用top,直接终止程序报错
assert(ps->top > 0);
ps->top--;
}
//返回栈顶元素
StackDataType StackTop(Stack* ps)
{
assert(ps);
assert(ps->top > 0);
return ps->arry[ps->top - 1];
}
//返回栈中元素个数
int StackSize(Stack* ps)
{
assert(ps);
return ps->top;
}
//是否为空
bool StackEmpty(Stack* ps)
{
assert(ps);
return ps->top == 0;//真为空,假为非空。
}
//////////////////////////////////////////////////////////
typedef struct
{
Stack pushST;
Stack popST;
} MyQueue;

/** Initialize your data structure here. */

MyQueue* myQueueCreate()
{
MyQueue* q = (MyQueue*)malloc(sizeof(MyQueue));
if(q == NULL)
{
printf("malloc is fail!");
return;
}
StackInit(&q->pushST);
StackInit(&q->popST);
return q;
}

/** Push element x to the back of queue. */
void myQueuePush(MyQueue* obj, int x)
{
//入数据就往pushST里面入
StackPush(&obj->pushST,x);
}

/** Removes the element from in front of queue and returns that element. */
int myQueuePop(MyQueue* obj)
{
//类似于下面的peek
// if(StackEmpty(&obj->popST))
// {
// while(!StackEmpty(&obj->pushST))
// {
// StackPush(&obj->popST,StackTop(&obj->pushST));
// StackPop(&obj->pushST);
// }
// }
// int top = StackTop(&obj->popST);
///////////////////////////////////////////////////////////////
//或者直接调用下面的myQueuePeek函数直接获取popST的栈顶元素
//保存给top之后删除,然后return
int top = myQueuePeek(obj);
StackPop(&obj->popST);
return top;
}

/** Get the front element. */
int myQueuePeek(MyQueue* obj)
{
//出数据要从popST里面出
//如果popST里面是空的
//就要先从pushST里面拿
if(StackEmpty(&obj->popST))
{
//把pushST里面的元素导到popST里面
//然后取第一个
while(!StackEmpty(&obj->pushST))
{
//取pushST最上面的元素依次压进popST
StackPush((&obj->popST),StackTop(&obj->pushST));
StackPop(&obj->pushST);
}
}
return StackTop(&obj->popST);
}

/** Returns whether the queue is empty. */
bool myQueueEmpty(MyQueue* obj)
{
return StackEmpty(&obj->popST) && StackEmpty(&obj->pushST);
}

void myQueueFree(MyQueue* obj)
{
StackDestory(&obj->pushST);
StackDestory(&obj->popST);
free(obj);
}

/**
* Your MyQueue struct will be instantiated and called as such:
* MyQueue* obj = myQueueCreate();
* myQueuePush(obj, x);

* int param_2 = myQueuePop(obj);

* int param_3 = myQueuePeek(obj);

* bool param_4 = myQueueEmpty(obj);

* myQueueFree(obj);
*/