C#使用双堆栈创建队列
下面的程序代码中的函数ShowStackOperation()演示了上述介绍的堆栈五种常用操作。
- private void ShowStackOperation()
- {
- Stack s = new Stack(); ///创建一个堆栈s
- s.Push("Hello word."); ///元素"Hello word."入栈
- s.Push(1); ///元素入栈
- s.Pop(); ///元素出栈
- int stackCount = s.Count; ///获取堆栈的元素个数
- bool isEmpty = s.Count > 0 ? false : true; ///判断堆栈是否为空
- s.Clear(); ///清空堆栈的所有元素
- }
在下述程序代码中,笔者创建了一个类StackRealizeQueue。该类使用两个堆栈实现一个队列(一种先进先出的线性表)。并实现队列的常用操作,如元素入队、元素出队、清空队列、判断队列是否为空、获取队列元素个数等。
类StackRealizeQueue的构造函数初始化两个堆栈。其中fStack堆栈存放队列的值,sStack为备用堆栈,在队列出队时使用。清空队列、判断队列是否为空、获取队列元素个数的操作实现都比较简单,程序代码如下:
- /// <summary>
- /// 使用两个堆栈实现一个队列
- /// </summary>
- public class StackRealizeQueue
- {
- /// <summary>
- /// fStack堆栈存放队列的值
- /// </summary>
- Stack fStack;
- /// <summary>
- /// 备用堆栈,在队列出队时使用
- /// </summary>
- Stack sStack;
- /// <summary>
- /// 构造函数,初始化fStack和sStack
- /// </summary>
- public StackRealizeQueue()
- {
- fStack = new Stack();
- sStack = new Stack();
- }
- /// <summary>
- /// 清空队列
- /// </summary>
- public void Crear()
- {
- fStack.Clear();
- }
- /// <summary>
- /// 获取队列的长度
- /// </summary>
- public int Length
- {
- get{return fStack.Count;}
- }
- /// <summary>
- /// 判断队列是否为空
- /// </summary>
- public bool IsEmpty()
- {
- return (fStack.Count <= 0 && sStack.Count <= 0);
- }
下面分析两个堆栈实现一个队列的原理,设队列入队的元素依次为“1,2,3,4,5,6,7,8,9,10”,那么元素出队的顺序也是“1,2,3,4,5,6,7,8,9,10”。
当元素“1,2,3,4,5,6,7,8,9,10”全部入栈到fStack中时,它的排列顺序原来与排序顺序的相反,即为“10,9,8,7,6,5,4,3,2,1”。此时sStack堆栈为空,如图2.26所示。为了让元素“1”出队,此时,可以依次把元素“10,9,8,7,6,5,4,3,2,1”从fStack堆栈中弹出,并压入堆栈sStack中,如图2.27所示。然后元素“1”出队,此时,可以依次把元素“10,9,8,7,6,5,4,3,2”从sStack堆栈中弹出,并压入堆栈fStack中,如图2.28所示。
图2.26 元素入队 图2.27 元素“1”准备出队 图2.28 元素“1”出队之后
根据上面的分析,可以定义队列的入队和出队操作。当元素入队时,由于队列的元素仅仅存放在堆栈fStack中,因此只要把入队的元素入栈到堆栈fStack中即可。队列入队操作的程序代码如下:
- /// <summary>
- /// 元素入队
- /// </summary>
- public void EnQueue(object oValue)
- {
- fStack.Push(oValue);
- }
当元素出队时,由于队列的元素仅仅存放在堆栈fStack中。首先把堆栈fStack中的元素全部弹出,并压入到堆栈sStack中;然后堆栈sStack最上面一个元素出栈,并输出此元素;最后又重新把sStack堆栈的所有元素重新压入到fStack堆栈中,从而完成了队列出队的操作。队列出队操作的程序代码如下:
- /// <summary>
- /// 元素出队
- /// </summary>
- public object DeQueue()
- {
- if(IsEmpty() == true){return null;}
- if(sStack.Count > 0){return null;}
- ///把fStack堆栈的所有元素压入到sStack堆栈中
- while(fStack.Count > 0)
- {
- sStack.Push(fStack.Pop());
- }
- object oTemp = sStack.Pop(); ///获取sStack堆栈的最上面的元素
- ///把sStack堆栈的所有元素重新压入到fStack堆栈中
- while(sStack.Count > 0)
- {
- fStack.Push(sStack.Pop());
- }
- return oTemp;
- }
- }
应用程序Sample_02_06的StackPage.aspx页面中的函数Page_Load(object sender, EventArgs e)首先调用函数TestStackRealizeQueue()创建一个队列queue,并向队列中添加四个元素,它们依次是“true”、“$”、“34567”和“Hello Word”,然后打印队列中的所有元素。函数Page_Load(object sender, EventArgs e)的程序代码如下:
- protected void Page_Load(object sender, EventArgs e)
- {
- TestStackRealizeQueue();Response.End();
- }
- private void TestStackRealizeQueue()
- { ///创建一个队列
- StackRealizeQueue queue = new StackRealizeQueue();
- queue.Crear();
- bool b = true;
- char c = '$';
- int i = 34567;
- string s = "Hello Word";
- ///入队
- queue.EnQueue(b);
- queue.EnQueue(c);
- queue.EnQueue(i);
- queue.EnQueue(s);
- ///打印队列的所有元素
- while(queue.IsEmpty() == false)
- {
- Response.Write(queue.DeQueue().ToString() + "<br>");
- }
- }
把StackPage.aspx设为应用程序Sample_02_06的起始页面,并运行应用程序,StackPage.aspx页面如图2.29所示。
图2.29 StackPage.aspx页面显示双堆栈的操作结果
摘自人邮的《ASP.net 2.0编程指南》。
网址是:http://www.china-pub.com/computers/common/info.asp?id=35207
http://www.huachu.com.cn/itbook/itbookinfo.asp?lbbh=10061253
C#使用双堆栈创建队列相关推荐
- python堆栈与队列_python语言的堆栈与队列类的实现
基于python语言的数据结构之堆栈与队列的实现 # 堆栈的实现 # -*- coding: utf-8 -*- """ 栈(stack), 是一种容器,可以存入数据元素 ...
- java 队列复制_java - 复制堆栈或队列,而无需使用“克隆” - 堆栈内存溢出
复制堆栈和队列,而无需使用克隆. 例如,当我调用传递堆栈的方法时,我无法修改保留传递原始堆栈的权限. 我需要对传递的堆栈进行复制/克隆以更改/在方法中使用. 我只能使用Stack.java(附加). ...
- 【IT笔试面试题整理】堆栈和队列
如何准备: Whether you are asked to implement a simple stack / queue, or you are asked to implementa modi ...
- 7-22 堆栈模拟队列 (25 分)(详解夹思路)
一:题目 设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q. 所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数: int IsFull(Stack S):判断堆栈S是否已满,返回1或 ...
- java 队列和堆栈_Java中的堆栈和队列
java 队列和堆栈 我最近一直在研究一些需要堆栈和队列的Java代码. 使用的选择不是立即显而易见的. 有一个Queue接口,但没有明确的具体实现要使用. 还有一个Stack类,但是javadocs ...
- Java中的堆栈和队列
我最近一直在研究一些需要堆栈和队列的Java代码. 使用的选择不是立即显而易见的. 有一个Queue接口,但没有明确的具体实现要使用. 还有一个Stack类,但是javadocs指出其他类" ...
- 菜鸟的学习之路(11) — 堆栈与队列
一.堆栈: 堆栈我们先分开来说: 栈: 前面我们说过的8种基本数据类型和对象的引用变量,它们的值就存放在栈中.当它们除了作用域后会被自动释放.而且栈的存储速度快.数据可以共享,但是存在栈中的数据大小与 ...
- 创建队列 c语言_在C中创建队列
创建队列 c语言 A queue in C is basically a linear data structure to store and manipulate the data elements ...
- 如何在JavaScript中实现堆栈和队列?
本文翻译自:How do you implement a Stack and a Queue in JavaScript? What is the best way to implement a St ...
最新文章
- mysql连接查询之间的差异性
- 数学不好、英语不好、非本专业,想学python数据分析,能安排吗?
- Android ADB 源码分析(三)
- perl6 HTTP::UserAgent (2)
- 一条命令扫描局域网所以IP地址和MAC地址
- oracle select之后自动保存excel_Excel制作自动化仓库入库单,数据录入、计算、保存只需一键完成...
- 【Java】Java 的Object对象你真的懂了吗
- EXSi5.5安装篇
- 与FPGA相关的独热码
- ARM体系结构与编程
- 51nod 1384
- 像素测量工具_像素大厨PxCook for Mac(自动标注工具)中文免费版
- 日本财险容灾案例揭示小公司的容灾之道
- 在排查性能过程中如遇到cpu的wa高时该如何做(一)
- 调用百度翻译机器人接口纯代码
- 获取地址段的所有地址(二)
- Python机器学习:认识机器学习
- FAThdc.inc
- 沃森和特朗普:一家伟大美国企业的兴与衰
- 校园寝室管理系统-“轻舟校园”助力校园实现信息化、智能化管理