• 力扣在线OJ——栈和队列


    目录

    🍁一、用两个队列实现栈

    🌕(一)、题目(力扣链接:用队列实现栈 )

    🌕(二)、注意

    🌕(三)、解答

    ⭐️1.注意事项

    ⭐️2.第一个接口——匿名结构体

    ⭐️3.第二个接口——MyStack* myStackCreate()

    ⭐️4.第三个接口——void myStackPush(MyStack* obj, int x)

    ⭐️5.第四个接口——int myStackPop(MyStack* obj)

    ⭐️6.第五个接口——int myStackTop(MyStack* obj)

    ⭐️7.第六个接口——bool myStackEmpty(MyStack* obj)

    ⭐️8.第七个接口——void myStackFree(MyStack* obj)

    🌕(四)、第一题源代码

    ⭐️1.代码:

    ⭐️2.运行结果:

    🍁二、用栈实现队列

    🌕(一)、题目(力扣链接:用栈实现队列)

    🌕(二)、思路

    🌕(三)、解答

    ⭐️1.第一个接口——typedef struct

    ⭐️2.第二个接口——MyQueue* myQueueCreate()

    ⭐️3.第三个接口——void myQueuePush(MyQueue* obj, int x)

    ⭐️4.第四个接口——int myQueuePop(MyQueue* obj)

    ⭐️5.第五个接口——int myQueuePeek(MyQueue* obj)

    ⭐️6.第六个接口——bool myQueueEmpty(MyQueue* obj)

    ⭐️7.第七个接口——void myQueueFree(MyQueue* obj)

    🌕(四)、第二题源代码


    🍁一、用两个队列实现栈

    🌕(一)、题目(力扣链接:用队列实现栈 

    🌕(二)、注意

    与以前不同的是,这次的OJ的练习给了几个函数接口,这几个函数接口就是栈的操作的接口,我们需要用队列来实现,如下:

    这需要我们根据函数名来猜测一下每个函数的作用是什么,分析清楚了才能去考虑如何写代码,这大大增加了难度。

    🌕(三)、解答

    ⭐️1.注意事项

    (1).这道题的意思就是,这里又两个队列,并且只提供了队列操作的几个接口,如下:

    然后叫我们实现出一个栈;

    (2).首先我们没有队列,所以可以将上一次我们实现的队列复制粘贴过来,因为C语言库里面没有,所以我们要自己实现,等以后我们学习C++,就可以直接使用C++的库里面的各种东西,比如栈和队列就可以直接使用;

    ⭐️2.第一个接口——匿名结构体

    这是一个匿名结构体,感兴趣的小伙伴可以去了解一下,我们是可以更改里面的内容的,我们需要两个队列,所以把里面的内容改为两个队列;

    这样后续,我们可以通过MyStack栈来操作两个队列,即用两个队列实现栈。

    ⭐️3.第二个接口——MyStack* myStackCreate()

    ①:看函数名的意思就是“我的栈的初始化”

    ②:操作很简单,首先先创建一个MyStack栈的指针,然后为其动态分配空间;

    然后在使用我们自己的队列接口Queueinit,对栈的成员Que1和Que2进行初始化:

    1. //栈的初始化
    2. MyStack* myStackCreate() {
    3. MyStack *pst=(MyStack*)malloc(sizeof(MyStack));
    4. Queueinit(&pst->q1);
    5. Queueinit(&pst->q2);
    6. return pst;
    7. }
    ⭐️4.第三个接口——void myStackPush(MyStack* obj, int x)

    ①:很显然就是“入栈操作”

    ②:入栈很简单,我们只需要将入栈的元素入到不为空的队列中即可;

    这样就会呈现出一个队列为空,一个队列不为空的局面,方便我们后出栈的思路:

    1. //入栈
    2. void myStackPush(MyStack* obj, int x) {
    3. //根据思路分析,哪个队列不为空,就入队哪个队列
    4. if(!QueueEmpty(&obj->q1))
    5. {
    6. QueuePush(&obj->q1,x);
    7. }
    8. else
    9. {
    10. QueuePush(&obj->q2,x);
    11. }
    12. }
    ⭐️5.第四个接口——int myStackPop(MyStack* obj)

    ①:按函数名就是“出栈操作”的意思;

    ②:根据栈和队列的结构:

    栈为后进先出,队列为先进先出;

    所以想要出栈,即为出队队列的队尾元素;

    这里又有两个队列,所以可以想到一个思路

    ①:首先将不为空的队列的前size-1个元素导入空队列中:

    ②:此时之前不为空的队列中还剩下一个元素,而此元素即为我们要出栈的元素

    ③:完成一轮后,之前不为空的队列就变为空队列,之前的空队列就变为不为空队列了,之后循环操作即可:

    1. //出栈
    2. int myStackPop(MyStack* obj) {
    3. //根据思路分析,将不为空的队列一的前Size-1个元素导入空队列二;
    4. //再将不为空的队列一剩余的一个元素出队返回,即为出栈操作;
    5. //首先我们不知道哪个队列为空,所以我们可以使用“假设法”找出空队列
    6. Que* empty = &obj->q1;
    7. Que* noempty = &obj->q2;
    8. if (!QueueEmpty(&obj->q1))
    9. {
    10. empty = &obj->q2;
    11. noempty = &obj->q1;
    12. }
    13. //然后将不为空的队列的前size-1个元素导入空队列
    14. while (QueueSize(noempty) > 1)
    15. {
    16. //取不为空队列的队头,导入空队列
    17. QueuePush(empty, QueueFront(noempty));
    18. //不为空队列出队,导入下一个元素
    19. QueuePop(noempty);
    20. }
    21. //到这里,不为空的队列只剩下一个元素,即我们需要出栈的元素;
    22. //保存该元素
    23. int top = QueueFront(noempty);
    24. //出队
    25. QueuePop(noempty);
    26. //返回
    27. return top;
    28. }
    ⭐️6.第五个接口——int myStackTop(MyStack* obj)

    ①:看函数名意为“返回栈顶元素”

    ②:思路:根据栈和队列的使用规则或者上述出栈操作的思路,我们应该清楚,栈的栈顶即为队列的队尾元素;

    ③:步骤:所以我们只需要找到不为空的队列然后返回其队尾元素即可;

    1. //返回栈顶元素
    2. int myStackTop(MyStack* obj) {
    3. //因为栈为后进先出,队列为先进先出,所以要返回栈顶元素,即返回不为空队列的队尾元素
    4. if (!QueueEmpty(&obj->q1))
    5. {
    6. return QueueBack(&obj->q1);
    7. }
    8. else
    9. {
    10. return QueueBack(&obj->q2);
    11. }
    12. }
    ⭐️7.第六个接口——bool myStackEmpty(MyStack* obj)

    ①:看函数名意为“判断栈空”

    ②:只需要看两个队列是否同时为空,若两个队列同时为空,则栈空;

    1. //栈的判空
    2. bool myStackEmpty(MyStack* obj) {
    3. //两队列为空,即栈为空,所以直接用逻辑值判断
    4. return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);
    5. }
    ⭐️8.第七个接口——void myStackFree(MyStack* obj)

    ①:函数名意为“栈的销毁”

    ②:我们要注意,除了要释放动态开辟的MyStack空间,之前还要将两个队列给释放掉;

    1. //栈的销毁
    2. void myStackFree(MyStack* obj) {
    3. QueueDestroy(&obj->q1);
    4. QueueDestroy(&obj->q2);
    5. free(obj);
    6. }

    🌕(四)、第一题源代码

    ⭐️1.代码:
    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include
    4. #include
    5. #include
    6. typedef int QDatatype;
    7. typedef struct QueueNode
    8. {
    9. struct QueueNode* next;
    10. QDatatype data;
    11. }QNode;
    12. typedef struct Queue
    13. {
    14. QNode* head;//头指针,指向首结点
    15. QNode* tail;//尾指针,指向为结点
    16. int size;//记录队列长度
    17. }Que;
    18. //初始化
    19. void Queueinit(Que* ps);
    20. //销毁
    21. void QueueDestroy(Que* ps);
    22. //入队
    23. void QueuePush(Que* ps, QDatatype x);
    24. //出队
    25. void QueuePop(Que* ps);
    26. //取队头
    27. QDatatype QueueFront(Que* ps);
    28. //取队尾
    29. QDatatype QueueBack(Que* ps);
    30. //判空
    31. bool QueueEmpty(Que* ps);
    32. //获取队列元素个数
    33. int QueueSize(Que* ps);
    34. //初始化
    35. void Queueinit(Que* ps)
    36. {
    37. assert(ps);
    38. ps->head = ps->tail = NULL;
    39. ps->size = 0;
    40. }
    41. //销毁
    42. void QueueDestroy(Que* ps)
    43. {
    44. assert(ps);
    45. QNode* cur = ps->head;
    46. //先保存下一个结点,在释放当前结点,在重定位
    47. while (cur)
    48. {
    49. QNode* Qnext = cur->next;
    50. free(cur);
    51. cur = Qnext;
    52. }
    53. ps->head = ps->tail = NULL;
    54. ps->size = 0;
    55. }
    56. //入队
    57. void QueuePush(Que* ps, QDatatype x)
    58. {
    59. assert(ps);
    60. //创建一个新结点
    61. QNode* newnode = (QNode*)malloc(sizeof(QNode));
    62. if (newnode == NULL)
    63. {
    64. perror("malloc");
    65. return;
    66. }
    67. //因为是在尾结点入队,所以入队之后结点next域要置空
    68. newnode->data = x;
    69. newnode->next = NULL;
    70. //第一次插入是结构体指针之间的赋值,之后才是结构体成员的赋值,所以要分情况
    71. //记住tail指针始终指向尾结点,所以入队之后要对tail指针重定位
    72. if (ps->tail == NULL)
    73. {
    74. ps->head = ps->tail = newnode;
    75. }
    76. else
    77. {
    78. ps->tail->next = newnode;
    79. ps->tail = newnode;
    80. }
    81. //入队后元素数量+1
    82. ps->size++;
    83. }
    84. //出队
    85. void QueuePop(Que* ps)
    86. {
    87. assert(ps);
    88. //检查队列是否为空,若为空则assert函数报错提示
    89. assert(!QueueEmpty(ps));
    90. //队列不为空,进行尾删
    91. //当对列只剩下一个元素时,要注意head和tail指针都要指向NULL,所以为了安全起见,进行分类讨论
    92. if (ps->head->next == NULL)
    93. {
    94. free(ps->head);
    95. //注意free释放的是该指针指向的空间,而不是释掉该指针
    96. ps->head = ps->tail = NULL;
    97. }
    98. else
    99. {
    100. QNode* next = ps->head->next;
    101. free(ps->head);
    102. ps->head = next;
    103. }
    104. //出队列,元素数量-1
    105. ps->size--;
    106. }
    107. //取队头
    108. QDatatype QueueFront(Que* ps)
    109. {
    110. assert(ps);
    111. //检查队列为不为空
    112. assert(!QueueEmpty(ps));
    113. //返回首结点的data域
    114. return ps->head->data;
    115. }
    116. //取队尾
    117. QDatatype QueueBack(Que* ps)
    118. {
    119. assert(ps);
    120. //检查队列为不为空
    121. assert(!QueueEmpty(ps));
    122. //返回尾结点的data域
    123. return ps->tail->data;
    124. }
    125. //判空
    126. bool QueueEmpty(Que* ps)
    127. {
    128. assert(ps);
    129. //为空返回真,不为空返回假
    130. return ps->head == NULL;
    131. }
    132. //获取队列元素个数
    133. int QueueSize(Que* ps)
    134. {
    135. assert(ps);
    136. return ps->size;
    137. }
    138. typedef struct {
    139. Que q1;
    140. Que q2;
    141. } MyStack;
    142. //栈的初始化
    143. MyStack* myStackCreate() {
    144. MyStack* pst = (MyStack*)malloc(sizeof(MyStack));
    145. Queueinit(&pst->q1);
    146. Queueinit(&pst->q2);
    147. return pst;
    148. }
    149. //入栈
    150. void myStackPush(MyStack* obj, int x) {
    151. //根据思路分析,哪个队列不为空,就入队哪个队列
    152. if (!QueueEmpty(&obj->q1))
    153. {
    154. QueuePush(&obj->q1, x);
    155. }
    156. else
    157. {
    158. QueuePush(&obj->q2, x);
    159. }
    160. }
    161. //出栈
    162. int myStackPop(MyStack* obj) {
    163. //根据思路分析,将不为空的队列一的前Size-1个元素导入空队列二;
    164. //再将不为空的队列一剩余的一个元素出队返回,即为出栈操作;
    165. //首先我们不知道哪个队列为空,所以我们可以使用“假设法”找出空队列
    166. Que* empty = &obj->q1;
    167. Que* noempty = &obj->q2;
    168. if (!QueueEmpty(&obj->q1))
    169. {
    170. empty = &obj->q2;
    171. noempty = &obj->q1;
    172. }
    173. //然后将不为空的队列的前size-1个元素导入空队列
    174. while (QueueSize(noempty) > 1)
    175. {
    176. //取不为空队列的队头,导入空队列
    177. QueuePush(empty, QueueFront(noempty));
    178. //不为空队列出队,导入下一个元素
    179. QueuePop(noempty);
    180. }
    181. //到这里,不为空的队列只剩下一个元素,即我们需要出栈的元素;
    182. //保存该元素
    183. int top = QueueFront(noempty);
    184. //出队
    185. QueuePop(noempty);
    186. //返回
    187. return top;
    188. }
    189. //返回栈顶元素
    190. int myStackTop(MyStack* obj) {
    191. //因为栈为后进先出,队列为先进先出,所以要返回栈顶元素,即返回不为空队列的队尾元素
    192. if (!QueueEmpty(&obj->q1))
    193. {
    194. return QueueBack(&obj->q1);
    195. }
    196. else
    197. {
    198. return QueueBack(&obj->q2);
    199. }
    200. }
    201. //栈的判空
    202. bool myStackEmpty(MyStack* obj) {
    203. //两队列为空,即栈为空,所以直接用逻辑值判断
    204. return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);
    205. }
    206. //栈的销毁
    207. void myStackFree(MyStack* obj) {
    208. QueueDestroy(&obj->q1);
    209. QueueDestroy(&obj->q2);
    210. free(obj);
    211. }
    212. int main()
    213. {
    214. MyStack pst = {0};
    215. MyStack* ppst = &pst;
    216. ppst=myStackCreate(&pst);
    217. myStackPush(ppst, 1);
    218. myStackPush(ppst, 2);
    219. myStackPush(ppst, 3);
    220. myStackPush(ppst, 4);
    221. while (!myStackEmpty(ppst))
    222. {
    223. printf("%d ", myStackTop(ppst));
    224. myStackPop(ppst);
    225. }
    226. printf("\n");
    227. myStackFree(ppst);
    228. return;
    229. }
    ⭐️2.运行结果:

    🍁二、用栈实现队列

    🌕(一)、题目(力扣链接:用栈实现队列

    🌕(二)、思路

    第一题是用队列实现栈,而这道题是用栈实现队列,所以两道题有很多相似的地方,小编就快速实现,只要把第一题搞懂了,这道题实现起来非常简单:

    ①:由第一题我们想到拿一个栈接收数据,一个栈为空,然后在导数据的方式引入思考:

    导完数据后:

    到这一步当我们再想重复操作时,就发现不同了,因为栈是后进先出,所以导完一次数据后,顺序会返过来,这时,我们只需要依次对q2进行出栈,即可实现队列的先进先出结构:

    入队的时候为6 5 4 3 2 1,而这样的操作出队的时候也为 6 5 4 3 2 1;

    所以我们会产生一个新的思路

    将q1栈用于存储入队的数据,再将栈q1中的数据出栈,然后入栈到q2中;

    当要出队时,只需要对q2进行出栈操作即为出队操作,当q2为空时,就将栈q1中的数据导过来;

    把思路理清,图画标准,接下来实现起来就方便多了;

    🌕(三)、解答

    ⭐️1.第一个接口——typedef struct

    ①:首先我们可以将以前实现过的栈的各个操作复制粘贴进来,没有的小伙伴可以直接看小编的源代码;

    ②:跟第一题一样,没有栈,我们就定义出两个栈q1和q2;

    1. typedef struct {
    2. ST q1;
    3. ST q2;
    4. } MyQueue;
    ⭐️2.第二个接口——MyQueue* myQueueCreate()

    ①:意为“初始化操作”,与第一题相同;

    1. //初始化
    2. MyQueue* myQueueCreate() {
    3. MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));
    4. STinit(&obj->q1);
    5. STinit(&obj->q2);
    6. return obj;
    7. }
    ⭐️3.第三个接口——void myQueuePush(MyQueue* obj, int x)

    ①:意为“入队操作”;

    ②:因为栈q1和栈q2的功能是区分开的,所以对于入队操作,我们只需对q1进行入栈操作区即可:

    1. //入队
    2. void myQueuePush(MyQueue* obj, int x) {
    3. //根据思路分析,我们直接将队列数据入栈到保存栈q1(即两个栈中,负责保存数据的栈)即可
    4. STPush(&obj->q1, x);
    5. }
    ⭐️4.第四个接口——int myQueuePop(MyQueue* obj)

    ①:意为“出队操作”;

    ②:上面我们都分析过了,只需要按照步骤来即可:

    1. //出队
    2. int myQueuePop(MyQueue* obj) {
    3. //根据思路分析,我们直接出栈q2即为出队操作,直到q2为空时,再将q1中的数据导入q2
    4. //先判断q2是否栈空,如果栈空,则将q1的数据导入q2,再出栈
    5. if (STEmpty(&obj->q2))
    6. {
    7. while (!STEmpty(&obj->q1))
    8. {
    9. //取q1栈顶元素,入栈到q2
    10. STPush(&obj->q2, STTop(&obj->q1));
    11. //q1出栈,以便下次导入数据
    12. STPop(&obj->q1);
    13. }
    14. }
    15. //因为不仅要出队,还要返回出队元素,所以先取栈顶元素保存,再出栈
    16. int top = STTop(&obj->q2);
    17. STPop(&obj->q2);
    18. return top;
    19. }
    ⭐️5.第五个接口——int myQueuePeek(MyQueue* obj)

    ①:意为“取队头操作”;

    ②:只需要对q2进行出栈并返回即可:

    1. //取队头元素
    2. int myQueuePeek(MyQueue* obj) {
    3. //根据栈和队列的结构,队头元素即为上述出栈的元素
    4. //先判断q2是否栈空,如果栈空,则将q1的数据导入q2,再出栈
    5. //导数据
    6. if (STEmpty(&obj->q2))
    7. {
    8. while (!STEmpty(&obj->q1))
    9. {
    10. //取q1栈顶元素,入栈到q2
    11. STPush(&obj->q2, STTop(&obj->q1));
    12. //q1出栈,以便下次导入数据
    13. STPop(&obj->q1);
    14. }
    15. }
    16. return STTop(&obj->q2);
    17. }
    ⭐️6.第六个接口——bool myQueueEmpty(MyQueue* obj)

    ①:意为“判断队空操作”;

    ②:操作与第一题相同:

    1. //判断队空
    2. bool myQueueEmpty(MyQueue* obj) {
    3. //只有当两个栈都为空时,队列才为空
    4. return STEmpty(&obj->q1) && STEmpty(&obj->q2);
    5. }
    ⭐️7.第七个接口——void myQueueFree(MyQueue* obj)

    ①:意为“队列的销毁”;

    ②:操作与第一题相同:

    1. //销毁
    2. void myQueueFree(MyQueue* obj) {
    3. //不仅要释放队列,还要销毁两个栈
    4. STDestroy(&obj->q1);
    5. STDestroy(&obj->q2);
    6. free(obj);
    7. }

    🌕(四)、第二题源代码

    1. //二、用栈实现队列
    2. typedef int DataType;
    3. typedef struct Stack
    4. {
    5. DataType* a;
    6. int top;//指向栈顶
    7. int catacity;//现有空间大小
    8. }ST;
    9. //初始化
    10. void STinit(ST* ps);
    11. //销毁
    12. void STDestroy(ST* ps);
    13. //入栈
    14. void STPush(ST* ps, DataType x);
    15. //出栈
    16. void STPop(ST* ps);
    17. //获取栈的元素个数
    18. int STSize(ST* ps);
    19. //判断是否为栈空
    20. bool STEmpty(ST* ps);
    21. //获取栈顶元素
    22. DataType STTop(ST* ps);
    23. //初始化
    24. void STinit(ST* ps)
    25. {
    26. assert(ps);
    27. //刚开始没有元素,所以top指向0
    28. ps->top = 0;
    29. ps->catacity = 0;
    30. ps->a = NULL;
    31. }
    32. //销毁
    33. void STDestroy(ST* ps)
    34. {
    35. assert(ps);
    36. free(ps->a);
    37. ps->top = 0;
    38. ps->catacity = 0;
    39. }
    40. //入栈
    41. void STPush(ST* ps, DataType x)
    42. {
    43. assert(ps);
    44. //空间满了进行增容
    45. if (ps->top == ps->catacity)
    46. {
    47. //第一次catacity值为0,所以判断一下给予赋值
    48. int newCatacity = (ps->catacity == 0 ? 4 : ps->catacity * 2);
    49. //使用realloc函数进行增容,刚开始a为NULL的话realloc函数的作用和malloc相同
    50. DataType* tmp = realloc(ps->a, sizeof(DataType) * newCatacity);
    51. //检查是否增容成功
    52. if (tmp == NULL)
    53. {
    54. perror("realloc");
    55. return;
    56. }
    57. ps->a = tmp;
    58. ps->catacity = newCatacity;
    59. }
    60. //插入
    61. ps->a[ps->top] = x;
    62. ps->top++;
    63. }
    64. //出栈
    65. void STPop(ST* ps)
    66. {
    67. assert(ps);
    68. //ps->top==0时为空栈
    69. if (0 == ps->top)
    70. {
    71. printf("栈为空,出栈失败!\n");
    72. return;
    73. }
    74. //出栈
    75. --ps->top;
    76. }
    77. //获取栈的元素个数
    78. int STSize(ST* ps)
    79. {
    80. assert(ps);
    81. return ps->top;
    82. }
    83. //判断是否为栈空
    84. bool STEmpty(ST* ps)
    85. {
    86. assert(ps);
    87. return ps->top == 0;
    88. }
    89. //获取栈顶元素
    90. DataType STTop(ST* ps)
    91. {
    92. assert(ps);
    93. if (0 == ps->top)
    94. {
    95. printf("栈为空,获取失败!\n");
    96. exit(-1);
    97. }
    98. return ps->a[ps->top - 1];
    99. }
    100. typedef struct {
    101. ST q1;
    102. ST q2;
    103. } MyQueue;
    104. //初始化
    105. MyQueue* myQueueCreate() {
    106. MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));
    107. STinit(&obj->q1);
    108. STinit(&obj->q2);
    109. return obj;
    110. }
    111. //入队
    112. void myQueuePush(MyQueue* obj, int x) {
    113. //根据思路分析,我们直接将队列数据入栈到保存栈q1(即两个栈中,负责保存数据的栈)即可
    114. STPush(&obj->q1, x);
    115. }
    116. //出队
    117. int myQueuePop(MyQueue* obj) {
    118. //根据思路分析,我们直接出栈q2即为出队操作,直到q2为空时,再将q1中的数据导入q2
    119. //先判断q2是否栈空,如果栈空,则将q1的数据导入q2,再出栈
    120. if (STEmpty(&obj->q2))
    121. {
    122. while (!STEmpty(&obj->q1))
    123. {
    124. //取q1栈顶元素,入栈到q2
    125. STPush(&obj->q2, STTop(&obj->q1));
    126. //q1出栈,以便下次导入数据
    127. STPop(&obj->q1);
    128. }
    129. }
    130. //因为不仅要出队,还要返回出队元素,所以先取栈顶元素保存,再出栈
    131. int top = STTop(&obj->q2);
    132. STPop(&obj->q2);
    133. return top;
    134. }
    135. //取队头元素
    136. int myQueuePeek(MyQueue* obj) {
    137. //根据栈和队列的结构,队头元素即为上述出栈的元素
    138. //先判断q2是否栈空,如果栈空,则将q1的数据导入q2,再出栈
    139. //导数据
    140. if (STEmpty(&obj->q2))
    141. {
    142. while (!STEmpty(&obj->q1))
    143. {
    144. //取q1栈顶元素,入栈到q2
    145. STPush(&obj->q2, STTop(&obj->q1));
    146. //q1出栈,以便下次导入数据
    147. STPop(&obj->q1);
    148. }
    149. }
    150. return STTop(&obj->q2);
    151. }
    152. //判断队空
    153. bool myQueueEmpty(MyQueue* obj) {
    154. //只有当两个栈都为空时,队列才为空
    155. return STEmpty(&obj->q1) && STEmpty(&obj->q2);
    156. }
    157. //销毁
    158. void myQueueFree(MyQueue* obj) {
    159. //不仅要释放队列,还要销毁两个栈
    160. STDestroy(&obj->q1);
    161. STDestroy(&obj->q2);
    162. free(obj);
    163. }
    164. int main()
    165. {
    166. MyQueue st = { 0 };
    167. MyQueue* pst = &st;
    168. pst = myQueueCreate(&st);
    169. myQueuePush(pst, 1);
    170. myQueuePush(pst, 2);
    171. myQueuePush(pst, 3);
    172. myQueuePush(pst, 4);
    173. while (!myQueueEmpty(pst))
    174. {
    175. printf("%d ", myQueuePeek(pst));
    176. myQueuePop(pst);
    177. }
    178. printf("\n");
    179. myQueueFree(pst);
    180. return 0;
    181. }

  • 相关阅读:
    自动化测试年薪50万你敢想吗?阿里P7都不淡定了...
    python数据类型及用法
    vue3的7种路由守卫使用大全
    9--OpenCV:图像基本操作之①阈值②形态学操作(腐蚀\膨胀,开、闭)
    C# 之 FileInfo API参考
    一体化运维管理平台:为企业提供全面监控和运维服务
    全面掌握胶囊网络:从基础理论到PyTorch实战
    【C++修炼之路】6. 内存管理
    halcon脚本-边缘及骨架的识别【附源码】
    【在线教育】课程封面上传图片到阿里云OSS
  • 原文地址:https://blog.csdn.net/hffh123/article/details/134048373