c语言俩个栈实现一个队列

//====================以下为自己实现=============================

思路,现在设有俩个栈sfront,sreal。完成一个队列。

     入队时,数据进入栈sreal, 数据永远保持在sreal中.

    出队时sreal数据依次出栈,然后入栈sfront, 在sfront出栈后,sfront出栈数据再存入sreal。


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define N 100
 

typedef int datatype_t;

typedef struct {
datatype_t data[N];
datatype_t top;
}seqstack_t; 
 
typedef struct stackqueue_p{
seqstack_t *front;
seqstack_t *real;
int count;
}sq_t;
 
/**
  *@brief 创建一个空的栈
 */
seqstack_t *seqstack_creat()
{
seqstack_t *s;
s=(seqstack_t *)malloc(sizeof(seqstack_t));
if(NULL==s)
{
printf(__FUNCTION__);
printf("ERROR in line %d",__LINE__);
return (seqstack_t *)-1;
}
//bzero(s,sizeof(seqstack_t));
memset(s, 0, sizeof(seqstack_t)); 
s->top=-1;

return s; 

 
/**
  *@brief 清空栈
 */
void seqstack_clear(seqstack_t *s)
{
s->top=-1;
}
 
/**
  *@brief 栈满
 */
datatype_t seqstack_full(seqstack_t *s)
{
if(s->top >= N-1)
{
printf("static full!");
return (datatype_t)1;
}
else
   return (datatype_t)0;
}
 
/**
  *@brief 栈空
 */
datatype_t seqstack_empty(seqstack_t *s)
{
if(s->top==-1)
{
//printf("static empty!\n");
return (datatype_t)1;
}
else
   return (datatype_t)0;
}
 
/**
  *@brief 入栈
 */
datatype_t seqstack_insert(seqstack_t *s,datatype_t value)
{
if(seqstack_full(s))
   return (datatype_t)-1;


s->top++;
s->data[s->top]=value;


return (datatype_t)0;
}
 
/**
  *@brief 出栈
 */
datatype_t seqstack_out(seqstack_t *s)
{
    if(seqstack_empty(s))
   return (datatype_t)-1;
   
datatype_t value=s->data[s->top];
s->top--;
return value;
}
 
/**
  *@brief 打印栈数据
 */
datatype_t seqstack_show(seqstack_t *s)
{
if(seqstack_empty(s))
   return (datatype_t)-1;
   
datatype_t i;   
for(i=0;i<=s->top;i++)
   printf("top %d=%d.\n",i,s->data[i]);
   
return (datatype_t)0;
}
 
/**
  *@brief 创建一个空栈队列
 */
sq_t *stackqueue_create()
{
sq_t *sq=(sq_t *)malloc(sizeof(sq_t));
sq->front = seqstack_creat();
sq->real = seqstack_creat();

if(NULL==sq)
{
printf(__FUNCTION__);
printf("error in line %d.\n",__LINE__);
return (sq_t*)-1;
}


return sq;
}
 
/**
  *@brief 入队
 */
int push(sq_t *sq,int value)
{
seqstack_insert(sq->real,value);
return 0;
 
}
 
/**
  *@brief 出队
 */
datatype_t pop(sq_t *sq)
{
if(!seqstack_empty(sq->real));
{
while(!seqstack_empty(sq->real))
{
seqstack_insert(sq->front,seqstack_out(sq->real));
}
}


datatype_t val=seqstack_out(sq->front);

if(!seqstack_empty(sq->front));
{
while(!seqstack_empty(sq->front))
{
seqstack_insert(sq->real,seqstack_out(sq->front));
}
}

return val;
}
 
/**
  *@brief 打印队列
 */
void stackqueue_show(sq_t *sq)
{
    //printf("sq->front:\n");
//seqstack_show(sq->front);

//printf("\nsq->real:\n");
seqstack_show(sq->real);
}




int main(int argc, char *argv[])
{
  sq_t *p=stackqueue_create();
 
push(p,1);
push(p,2);
push(p,3);
printf("\npush 1 2 3:\n");
stackqueue_show(p);


pop(p);
push(p,4);
push(p,5);
    printf("\npop(p):\n");
    stackqueue_show(p);
    
    pop(p);
    push(p,6);
    printf("\npop(p):\n");
    stackqueue_show(p);
    
    pop(p);
    printf("\npop(p):\n");
    stackqueue_show(p);
    
    system("PAUSE");
    return 0;
}


//=====================以下为转载================================

https://blog.csdn.net/u010916862/article/details/70244955

思路,现在设有俩个栈s1,s2。完成一个队列。

     入队时,数据进入栈s1。出队时检查s2栈是否为空,为空则将s1出栈,出栈数据依次入栈s2。完成一个s1全部出栈后,s2出栈既是此时的出队操作。如果s2不为空,那s2直接出栈。如果s2,s1都为空,此时队列为空,无法执行出队操作。代码如下。

  1. /**
  2. *@filename seqstack.c
  3. *@author haohaibo
  4. *@data 2017/4/15
  5. *@brief 俩个栈实现一个队列
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #define N 100
  11. typedef int datatype_t;
  12. typedef struct {
  13. datatype_t data[N];
  14. datatype_t top;
  15. } seqstack_t;
  16. typedef struct stackqueue_p{
  17. seqstack_t *front;
  18. seqstack_t *real;
  19. int count;
  20. } sq_t;
  21. /**
  22. *@brief 创建一个空的栈
  23. */
  24. seqstack_t *seqstack_creat()
  25. {
  26. seqstack_t *s;
  27. s=( seqstack_t *) malloc( sizeof( seqstack_t));
  28. if( NULL==s)
  29. {
  30. printf(__FUNCTION__);
  31. printf( "ERROR in line %d",__LINE__);
  32. return ( seqstack_t *) -1;
  33. }
  34. bzero(s, sizeof( seqstack_t));
  35. s->top= -1;
  36. }
  37. /**
  38. *@brief 清空栈
  39. */
  40. void seqstack_clear(seqstack_t *s)
  41. {
  42. s->top= -1;
  43. }
  44. /**
  45. *@brief 栈满
  46. */
  47. datatype_t seqstack_full( seqstack_t *s)
  48. {
  49. if(s->top>=N -1)
  50. {
  51. printf( "static full!");
  52. return ( datatype_t) 1;
  53. }
  54. else
  55. return ( datatype_t) 0;
  56. }
  57. /**
  58. *@brief 栈空
  59. */
  60. datatype_t seqstack_empty( seqstack_t *s)
  61. {
  62. if(s->top== -1)
  63. {
  64. printf( "static empty!");
  65. return ( datatype_t) 1;
  66. }
  67. else
  68. return ( datatype_t) 0;
  69. }
  70. /**
  71. *@brief 入栈
  72. */
  73. datatype_t seqstack_insert( seqstack_t *s, datatype_t value)
  74. {
  75. if(seqstack_full(s))
  76. return ( datatype_t) -1;
  77. s->top++;
  78. s->data[s->top]=value;
  79. return ( datatype_t) 0;
  80. }
  81. /**
  82. *@brief 出栈
  83. */
  84. datatype_t seqstack_out( seqstack_t *s)
  85. {
  86. datatype_t value=s->data[s->top];
  87. if(seqstack_empty(s))
  88. return ( datatype_t) -1;
  89. s->top--;
  90. return value;
  91. }
  92. /**
  93. *@brief 打印栈数据
  94. */
  95. datatype_t seqstack_show( seqstack_t *s)
  96. {
  97. datatype_t i;
  98. if(seqstack_empty(s))
  99. return ( datatype_t) -1;
  100. for(i= 0;i<=s->top;i++)
  101. printf( "top %d=%d.\n",i,s->data[i]);
  102. return ( datatype_t) 0;
  103. }
  104. /**
  105. *@brief 创建一个空栈队列
  106. */
  107. sq_t *stackqueue_create()
  108. {
  109. sq_t *sq=( sq_t *) malloc( sizeof( sq_t));
  110. sq->front=seqstack_creat();
  111. sq->real=seqstack_creat();
  112. if( NULL==sq)
  113. {
  114. printf(__FUNCTION__);
  115. printf( "error in line %d.\n",__LINE__);
  116. return ( sq_t*) -1;
  117. }
  118. //sq->front->top=sq->real->top=-1;
  119. return sq;
  120. }
  121. /**
  122. *@brief 入队
  123. */
  124. int push(sq_t *sq,int value)
  125. {
  126. seqstack_insert(sq->real,value);
  127. return 0;
  128. }
  129. /**
  130. *@brief 出队
  131. */
  132. datatype_t pop( sq_t *sq)
  133. {
  134. if(seqstack_empty(sq->real));
  135. {
  136. while(seqstack_empty(sq->real))
  137. {
  138. seqstack_insert(sq->front,seqstack_out(sq->real));
  139. }
  140. }
  141. return seqstack_out(sq->front);
  142. }
  143. /**
  144. *@brief 打印队列
  145. */
  146. void stackqueue_show(sq_t *sq)
  147. {
  148. seqstack_show(sq->front);
  149. seqstack_show(sq->real);
  150. }
  151. int main(void)
  152. {
  153. sq_t *p=stackqueue_create();
  154. push(p, 1);
  155. push(p, 2);
  156. push(p, 3);
  157. pop(p);
  158. stackqueue_show(p);
  159. }

猜你喜欢

转载自blog.csdn.net/qq_20398345/article/details/80885003