当前位置:   article > 正文

C语言笔记39 •数据结构--栈&队列-OJ•

C语言笔记39 •数据结构--栈&队列-OJ•

栈&队列-OJ

1.给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

(1).左括号必须用相同类型的右括号闭合。

(2).左括号必须以正确的顺序闭合。

(3).每个右括号都有一个对应的相同类型的左括号。

  1. //1.栈和队列OJ题:括号匹配问题
  2. #define _CRT_SECURE_NO_WARNINGS 1
  3. #include <stdio.h>
  4. #include <stdbool.h>
  5. #include <assert.h>
  6. #include <stdlib.h>
  7. typedef char STDataType;
  8. typedef struct Stack
  9. {
  10. STDataType* a;
  11. int top;
  12. int capacity;
  13. }ST;
  14. void StackInit(ST* ps);
  15. void StackDestory(ST* ps);
  16. void StackPush(ST* ps, STDataType x);// 入栈
  17. void StackPop(ST* ps);// 出栈
  18. STDataType StackTop(ST* ps);
  19. int StackSize(ST* ps);
  20. bool StackEmpty(ST* ps);
  21. void StackInit(ST* ps)
  22. {
  23. assert(ps);
  24. ps->a = (STDataType*)malloc(sizeof(STDataType) * 4);
  25. if (ps->a == NULL)
  26. {
  27. printf("malloc fail\n");
  28. exit(-1);
  29. }
  30. ps->capacity = 4;
  31. ps->top = 0;
  32. }
  33. void StackDestory(ST* ps)
  34. {
  35. assert(ps);
  36. free(ps->a);
  37. ps->a = NULL;
  38. ps->top = ps->capacity = 0;
  39. }
  40. // 入栈
  41. void StackPush(ST* ps, STDataType x)
  42. {
  43. assert(ps);
  44. if (ps->top == ps->capacity)//判断空间是否够用,不够就要增容
  45. {
  46. STDataType* tmp = (STDataType*)realloc(ps->a, ps->capacity * 2 * sizeof(STDataType));
  47. if (tmp == NULL)
  48. {
  49. printf("realloc fail\n");
  50. exit(-1);
  51. }
  52. else
  53. {
  54. ps->a = tmp;
  55. ps->capacity *= 2;
  56. }
  57. }
  58. ps->a[ps->top] = x;
  59. ps->top++;
  60. }
  61. // 出栈
  62. void StackPop(ST* ps)
  63. {
  64. assert(ps);
  65. // 栈空了,调用Pop,直接中止程序报错
  66. assert(ps->top > 0);
  67. //ps->a[ps->top - 1] = 0;
  68. ps->top--;
  69. }
  70. STDataType StackTop(ST* ps)
  71. {
  72. assert(ps);
  73. // 栈空了,调用Top,直接中止程序报错
  74. assert(ps->top > 0);
  75. return ps->a[ps->top - 1];
  76. }
  77. int StackSize(ST* ps)
  78. {
  79. assert(ps);
  80. return ps->top;
  81. }
  82. bool StackEmpty(ST* ps)
  83. {
  84. assert(ps);
  85. return ps->top == 0;
  86. }
  87. bool isValid(char* s)//判断符号
  88. {
  89. if (*s == ')' || *s == '}' || *s == ']')
  90. {
  91. return false;//匹配失败
  92. }
  93. //struct Stack st; //上面对struct Stack进行了重命名(line11) typedef struct Stack ST
  94. ST st;//创建 栈
  95. StackInit(&st);
  96. while (*s != '\0')
  97. {
  98. switch (*s)
  99. {
  100. case '(':
  101. case '{':
  102. case '[':
  103. {
  104. StackPush(&st, *s);
  105. s++;
  106. break;
  107. }
  108. case ')':
  109. case '}':
  110. case ']':
  111. {
  112. if (StackEmpty(&st))
  113. {
  114. StackDestory(&st);
  115. return false;
  116. }
  117. char top = StackTop(&st);
  118. StackPop(&st);
  119. if (top != '(' && *s == ')'
  120. || top != '{' && *s == '}'
  121. || top != '[' && *s == ']')
  122. {
  123. StackDestory(&st);
  124. return false;//匹配失败
  125. }
  126. else
  127. {
  128. s++;
  129. break;
  130. }
  131. }
  132. default:
  133. break;
  134. }
  135. }
  136. bool over = StackEmpty(&st);
  137. StackDestory(&st);
  138. return over;
  139. }
  140. bool isValid0(char* s) {
  141. ST st;
  142. StackInit(&st);
  143. while (*s != '\0')
  144. {
  145. switch (*s)
  146. {
  147. case '{':
  148. case '[':
  149. case '(':
  150. {
  151. StackPush(&st, *s);
  152. ++s;
  153. break;
  154. }
  155. case '}':
  156. case ']':
  157. case ')':
  158. {
  159. if (StackEmpty(&st))
  160. {
  161. StackDestory(&st);
  162. return false;
  163. }
  164. char top = StackTop(&st);
  165. StackPop(&st);
  166. // 不匹配
  167. if ((*s == '}' && top != '{')
  168. || (*s == ']' && top != '[')
  169. || (*s == ')' && top != '('))
  170. {
  171. StackDestory(&st);
  172. return false;
  173. }
  174. else // 匹配
  175. {
  176. ++s;
  177. }
  178. break;
  179. }
  180. default:
  181. break;
  182. }
  183. }
  184. bool ret = StackEmpty(&st);
  185. StackDestory(&st);
  186. return ret;
  187. }
  188. int main()
  189. {
  190. printf("%d\n", isValid("))"));
  191. printf("%d\n", isValid("(){}[]"));
  192. return 0;
  193. }

2.请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppop 和 empty)。

实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
  1. //2.栈和队列OJ题:用队列实现栈
  2. #define _CRT_SECURE_NO_WARNINGS 1
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <assert.h>
  6. #include <stdbool.h>
  7. typedef int QDataType;
  8. typedef struct QueueNode
  9. {
  10. QDataType data;
  11. struct QueueNode* next;
  12. }QNode;
  13. typedef struct Queue
  14. {
  15. QNode* head;
  16. QNode* tail;
  17. }Queue;
  18. void QueueInit(Queue* pq)//初始化队列
  19. {
  20. assert(pq);
  21. pq->head = pq->tail = NULL;
  22. }
  23. void QueueDestory(Queue* pq)//销毁队列
  24. {
  25. assert(pq);
  26. QNode *cur= pq->head;
  27. while (cur)
  28. {
  29. QNode* temp = cur->next;
  30. free(cur);
  31. cur = temp;
  32. }
  33. pq->head = pq->tail = NULL;
  34. }
  35. void PrintQueue(Queue* pq)//打印队列数据
  36. {
  37. assert(pq);
  38. QNode* cur = pq->head;
  39. while (cur)
  40. {
  41. printf("%d ", cur->data);
  42. cur = cur->next;
  43. }
  44. printf("\n");
  45. }
  46. QNode* Buynode(QDataType x)//申请节点
  47. {
  48. QNode* newnode = (QNode*)malloc(sizeof(QNode));
  49. if (newnode == NULL)
  50. {
  51. perror("malloc fail");
  52. exit(1);
  53. }
  54. newnode->data = x;
  55. newnode->next = NULL;
  56. }
  57. void QueuePush(Queue* pq, QDataType x)//队尾插入数据(队尾进)
  58. {
  59. assert(pq);
  60. if (pq->head == NULL)
  61. {
  62. pq->head = pq->tail = Buynode(x);
  63. }
  64. else
  65. {
  66. pq->tail->next = Buynode(x);
  67. pq->tail = pq->tail->next;
  68. }
  69. }
  70. void QueuePop(Queue* pq)//队头删除数据(队头出)
  71. {
  72. assert(pq);
  73. if (pq->head == pq->tail)
  74. {
  75. free(pq->head);
  76. pq->head = pq->tail=NULL;
  77. }
  78. else
  79. {
  80. QNode* temp = pq->head->next;
  81. free(pq->head);
  82. pq->head = temp;
  83. }
  84. }
  85. bool QueueEmpty(Queue* pq)//判断队列是否为空
  86. {
  87. assert(pq);
  88. return pq->head == NULL;
  89. }
  90. size_t QueueSize(Queue* pq)//队列的长度
  91. {
  92. assert(pq);
  93. size_t size = 0;
  94. QNode* cur = pq->head;
  95. while (cur)
  96. {
  97. size++;
  98. cur = cur->next;
  99. }
  100. return size;
  101. }
  102. QDataType QueueFront(Queue* pq)//输出队头的数据值
  103. {
  104. assert(pq);
  105. assert(pq->head);
  106. return pq->head->data;
  107. }
  108. QDataType QueueBack(Queue* pq)//输出队尾的数据值
  109. {
  110. assert(pq);
  111. assert(pq->tail);
  112. return pq->tail->data;
  113. }
  114. typedef struct
  115. {
  116. Queue q1;
  117. Queue q2;
  118. }MyStack;
  119. MyStack* myStackCreate()//创建一个栈
  120. {
  121. MyStack* ps = (MyStack*)malloc(sizeof(MyStack));
  122. if (ps == NULL)
  123. {
  124. perror("malloc fail\n!");
  125. exit(-1);
  126. }
  127. QueueInit(&ps->q1);
  128. QueueInit(&ps->q2);
  129. return ps;
  130. }
  131. void myStackPush(MyStack* obj, QDataType x)//(入栈)
  132. {
  133. if (!QueueEmpty(&obj->q1))
  134. {
  135. QueuePush(&obj->q1, x);
  136. }
  137. else
  138. {
  139. QueuePush(&obj->q2, x);
  140. }
  141. }
  142. int myStackPop(MyStack* obj)//删除栈顶数据 (出栈)
  143. {
  144. //假设obj->q1 指向的队列是空的;obj->q2 指向的队列不是空的;但确定肯定一个是空的,一个非空
  145. Queue* empty = &obj->q1;
  146. Queue* noempty = &obj->q2;
  147. //如果上方假设失败,进行转换,obj->q2 指向的队列是空的;obj->q1 指向的队列是非空的;
  148. if (!QueueEmpty(&obj->q1))
  149. {
  150. empty = &obj->q2;
  151. noempty = &obj->q1;
  152. }
  153. //数据倒换
  154. while (QueueSize(noempty)>1)
  155. {
  156. QDataType head = QueueFront(noempty);
  157. QueuePush(empty, head);
  158. QueuePop(noempty);
  159. }
  160. //剩下最后一个数据了
  161. QDataType top = QueueFront(noempty);
  162. QueuePop(noempty);
  163. return top;
  164. }
  165. QDataType myStackTop(MyStack* obj)//返回栈顶数据
  166. {
  167. if (!QueueEmpty(&obj->q1))
  168. {
  169. return QueueBack(&obj->q1);
  170. }
  171. else
  172. {
  173. return QueueBack(&obj->q2);
  174. }
  175. }
  176. bool myStackEmpty(MyStack* obj)//判断栈是否为空
  177. {
  178. return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);
  179. }
  180. void myStackFree(MyStack* obj)//栈销毁
  181. {
  182. QueueDestory(&obj->q1);
  183. QueueDestory(&obj->q2);
  184. free(obj);
  185. obj = NULL;
  186. }
  187. int main()
  188. {
  189. MyStack* st = myStackCreate();
  190. myStackPush(st, 1);
  191. myStackPush(st, 2);
  192. myStackPush(st, 3);//入栈
  193. myStackPop(st);//出栈
  194. printf("%d \n", myStackTop(st));//返回栈顶数据
  195. myStackFree(st);//销毁栈
  196. return 0;
  197. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/921834
推荐阅读
相关标签
  

闽ICP备14008679号