队列与栈: 队列(Queue)是一种先进先出(FIFO)的线性表; 栈(Stack)是一种后进先出(LIFO)的线性表; 实例1: 用队列实现栈的功能; 算法思想: 若实现一个栈的功能,需要用到两个队列来实现此功能,创建两个队列Q1和Q2; 入栈: 1.先判断Q1是否为空; 2.若Q1为空,则数据元素依次入队到Q1,而Q2的数据元素依次出队,并入队到Q1,即数据元素在Q1完成入栈; 3.若Q1为不为空,则数据元素依次入队到Q2,而Q1的数据元素依次出队,并入队到Q2,即数据元素在Q2完成入栈; 出栈: 1.判断Q1是否为空; 2.若Q1不为空,则Q1的数据元素出队,即数据元素在Q1出栈; 3.若Q1为空且Q2不为空,则Q2的数据元素出队,即数据元素在Q2出栈; 4.若Q1为空且Q2为空,即所构造的栈为空; 入栈代码: int  push_stack ( queue_t  * Q1, queue_t  * Q2, int  data) { if ( NULL  ==  Q1 ||  NULL  ==  Q2) { printf ( "入参为NULL\n" ) ; return  - 1 ; } int  num =  0 ; if ( is_empty ( Q1) ) { push_queue ( Q1, data) ; while ( ! is_empty ( Q2) ) { pop_queue ( Q2, & num) ; push_queue ( Q1, num) ; } }  else  { push_queue ( Q2, data) ; while ( ! is_empty ( Q1) ) {  pop_queue ( Q1, & num) ; push_queue ( Q2, num) ; } } return  0 ; } 
int  pop_stack ( queue_t  * Q1, queue_t  * Q2, int  * data) { if ( NULL  ==  Q1 ||  NULL  ==  Q2 ||  NULL  ==  data) { printf ( "入参为NULL\n" ) ; return  - 1 ; } if ( is_empty ( Q1) ) { if ( is_empty ( Q2) ) { printf ( "栈空,出栈失败\n" ) ; }  else  { pop_queue ( Q2, data) ; } }  else  { pop_queue ( Q1, data) ; } return  0 ; } 
实例2: 用栈实现队列的功能; 算法思想: 若实现一个队列的功能,需要用到两个栈来实现此功能,创建两个栈S1和S2; 入队列: 所有的数据元素都入栈到S1,即所有的数据元素在S1完成入队列; 出队列: 判断S2是否为空; 若S2不为空,则数据元素在S2出栈,即数据元素在S2完成出队列; 若S2为空且S1不为空,则S1中所有数据元素依次在S1出栈并依次入栈到S2,接下来,所有的数据元素在S2出栈,即所有的数据元素在S2完成出队列; 若S2为空且S1为空,即所构造的队列为空; 入队列代码: int  push_queue ( stack_t  * S1,  int  data) { if ( NULL  ==  S1) { printf ( "入参为NULL\n" ) ; return  - 1 ; } push_stack ( S1,  data) ; return  0 ; 
} 
int  pop_queue ( stack_t  * S1,  stack_t  * S2,  int  * data) { if ( NULL  ==  S1 ||  NULL  ==  S2 ||  NULL  ==  data) { printf ( "入参为NULL\n" ) ; return  - 1 ; } if ( ! is_empty ( S2) ) { pop_stack ( S2,  data) ; } else { if ( ! is_empty ( S1) ) { int  num =  0 ; while ( ! is_empty ( S1) ) { pop_stack ( S1,  & num) ; push_stack ( S2,  num) ; } pop_stack ( S2,  data) ; } else { printf ( "队列为空,出队失败\n" ) ; } } return  0 ; 
}