队列与栈: 队列(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 ;
}