温故而知新 -> 数据结构 -> 线性表 ->队列 && 栈
写这篇博客的主要意义在于,想说明如何利用 栈去实现队列,或者如何用 队列去实现栈!
注:想查看其他有关数据结构知识,可点击链接 温故而知新 -> 数据结构 进行查看!
基础知识
此处关于 队列 与 栈 的具体知识可参考博主下面的两篇博客
且上述两篇博客中也说明了 栈 与 队列 各自的程序实现!
实现
结构
1、利用 栈 实现 队列
利用栈实现队列,则需要两个栈,一个为入队栈,一个为出队栈,对应于队列中的 入队 与 出队 。
入队push
:将数据存入至 入队栈 中
出队pop
:由于 栈 满足 LIFO
准则,则若要实现 队列 出队操作,则需将上述 入队栈 中的数据存入至 出队栈 中,此时可实现将一开始输入的数据存入 出队栈 的栈顶,即此时 pop
的数据将为最开始的数据,满足了 FIFO
准则。
注意:当 出队栈 中数据未空时,不可将 入队栈 中的数据存入其中,否则会导致数据顺序错乱,无法准确实现 FIFO
!
如此情况下,队头元素 则将是 出队栈 的 栈顶元素,队尾元素 则将是 入队栈 的 栈顶元素!
2、利用 队列 实现 栈
利用 队列 实现 栈 有两种方法,但差别不大,具体如下:
方法一:利用一个队列
入栈 push
:按照正常顺序将数据存入,此处无伤大雅
出栈 pop
:利用 队列 实现 栈 的关键在于 栈 的 出栈操作,这一关键需要将原队列中此时的 队尾元素 放至 队头,使其等同于 栈 中的栈顶元素。
该步骤操作是将队列中的其他数据依次取出,然后按顺序从队尾存入该队列,直至原队尾元素到达队头,再对其进行 出队 操作,即可实现 出栈pop 。
具体如下图
方法二:利用2个队列
入栈 push
:按照正常顺序将数据存入2个队列中的非空队列
出栈 pop
:方法二中还是需要将原队列中此时的 队尾元素 放至 队头,使其等同于 栈 中的栈顶元素,实现过程与方法一中略有不同。
该步骤操作是将非空队列中的其他数据依次从队头取出,然后按顺序将这些数据存入空队列中,直至原队列中的目标队尾元素到达队头,再对其进行 出队 操作,即可实现 出栈pop ,此时原队列也将变为空队列。
注意:2个队列实现栈时,进行每次操作需保证操作结束后,其中一个队列为 空队列!
具体如下图
程序实现
1、利用 栈 实现 队列
在这一部分呢,基于上面所说的实现方法,并利用 C语言
中的 结构体 和 C++
中的 类 分别进行了实现!
具体实现程序可见下附链接:
2、利用 队列 实现 栈
在这一部分,同样基于上面所说的实现方法,然后利用 C语言
中的 结构体 和 C++
中的 类 分别对 利用队列实现栈 进行了实现!
其中,采用了两种方式,即利用一个队列 和 利用两个队列 去实现栈,对应的程序都在下附链接的程序中有所展现!
具体实现程序可见下附链接: