当前位置:   article > 正文

队列中取最大值操作_数据结构每次出队最大值

数据结构每次出队最大值

       这是一个要在队列中记录最大值的问题,但每次进队或出队又不能通过遍历去检测最大值的变化。用两个堆栈去实现一个队列是比较常见的方法,书中巧妙的用到了此方法,这样问题就转化为堆栈中取最大值操作问题。由于堆栈的变化只在栈顶,借助反向推导的思想:

       由于在Push的过程中,最大值只与某一些值有关,这些值会在Push的过程中形成一个有序的链式结构。如Push(1,2,6,4,5,2,7,4)那么这个有序序列为(1,2,6,7) 所以当7被POP时,最大值会回到6,6被POP时,最大值会回到2,整个过程与4,5无关。所以可以用一个数组记录下当堆栈中某一个数被POP后,下一个最大值在堆栈中的位置。

       "如果入栈顺序是12354,那么
        正常堆栈:12354
        最大值堆栈1235
        此时当前最大值是5,如果弹出4,当前最大值还是5,如果再弹出5,当前最大值是3,以此类推,应该没问题呀。“文中的主要思想就是按照这个思想来的,与编程之美中的想法始终感觉有点不吻合,与编程之美中的主要思想比较吻合的可以参考博客”http://blog.csdn.net/caryaliu/article/details/8097209“。

我在此给出我实现的C语言代码如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. typedef struct StackNode
  5. {
  6. char data;
  7. struct StackNode *next;
  8. }StackNode,*LinkStackPtr;
  9. typedef struct LinkStack
  10. {
  11. LinkStackPtr top;
  12. int count;
  13. }LinkStack;
  14. int InitStack(LinkStack *S)
  15. {
  16. S->top = (LinkStackPtr)malloc(sizeof(StackNode));
  17. if(!S->top)
  18. return 0;
  19. S->top=NULL;
  20. S->count=0;
  21. return 1;
  22. }
  23. /* 插入元素e为新的栈顶元素 */
  24. int Push(LinkStack *S,char e)
  25. {
  26. LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode));
  27. s->data=e;
  28. s->next=S->top; /* 把当前的栈顶元素赋值给新结点的直接后继,见图中① */
  29. S->top=s; /* 将新的结点s赋值给栈顶指针,见图中② */
  30. S->count++;
  31. return 1;
  32. }
  33. /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
  34. int Pop(LinkStack *S,char *e)
  35. {
  36. LinkStackPtr p;
  37. if(S->count==0)
  38. return 0;
  39. *e=S->top->data;
  40. p=S->top; /* 将栈顶结点赋值给p,见图中③ */
  41. S->top=S->top->next; /* 使得栈顶指针下移一位,指向后一结点,见图中④ */
  42. free(p); /* 释放结点p */
  43. S->count--;
  44. return 1;
  45. }
  46. /* 若栈不空,则用e返回S的栈顶元素,并返回1;否则返回0 */
  47. int GetTop(LinkStack S,char *e)
  48. {
  49. if (S.top==NULL)
  50. return 0;
  51. else
  52. *e=S.top->data;
  53. return 1;
  54. }
  55. /*将栈中的元素最大值压入栈中*/
  56. int MaxPush(LinkStack *s,char e)
  57. {
  58. char a;
  59. GetTop(*s,&a); //获取栈顶元素
  60. if (a<=e)
  61. {
  62. Push(s,e);
  63. }
  64. return 1;
  65. }
  66. int main()
  67. {
  68. LinkStack S,S1;
  69. char e=0;
  70. char *max="12645274";
  71. int i,j,len=strlen(max);
  72. j=InitStack(&S);
  73. InitStack(&S1);
  74. if (j==1)
  75. {
  76. for (i=0;i<len;i++)
  77. {
  78. MaxPush(&S,max[i]); //将最大值压入栈中
  79. Push(&S1,max[i]);
  80. }
  81. }
  82. printf("最大值栈中的数据为: \n");
  83. for (i=S.count;S.count>0;i--)
  84. {
  85. Pop(&S,&e);
  86. printf("max %c\n",e);
  87. }
  88. /*printf("保存原数据栈为:\n");
  89. for (i=S1.count;S1.count>0;i--)
  90. {
  91. Pop(&S1,&e);
  92. printf("max %c\n",e);
  93. }*/
  94. system("pause");
  95. return 0;
  96. }


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

闽ICP备14008679号