上一篇讲过队列(queue),队列就像是居民楼里的垃圾管道,从楼道的垃圾管道的入口处将垃圾扔进去,清洁工会从一楼垃圾管道的出口处将垃圾拿走。每一层的垃圾通道入口与一楼的垃圾管道出口之间都形成了一个队列,先被扔进垃圾道里的垃圾会先到达垃圾通道的出口,即:先进先出。

栈是一种更简单的数据结构,如果队列是垃圾通道,那栈就是垃圾桶,先扔进垃圾桶的垃圾都被压桶底了,反而是后仍进去的垃圾会先被倒出来。这种后进先出的数据结构,就是——栈(stack)。

队列的三要素是队伍,队头,队尾。

在PowerShell中可以用一个动态数组表示队伍,用两个变量来表示队头和队尾之于数组中的位置。

队列(垃圾道)有两头,数据从一头进,另一头出。进的那头叫队尾,出的那头叫队头。

栈(垃圾桶)只有一头,从哪头进就从哪头出,进的那头叫顶(垃圾桶都是立着放)。

在PowerShell中可以用一个动态数组来表示栈,栈顶之于数组的位置就用一个变量来记录。

$stack = New-Object System.Collections.ArrayList
#Create a stack of numbers.
$flag = $true
while($flag)
{
$input = Read-Host "Put a number into the stack"
$stack.Add([int] $input)
$choice = Read-Host "Press 'c' to continue, any other key to quit"
if($choice -ne 'c')
{
$flag = $false
}
}
$top = $stack.count-1
$stack_top = $stack[$top]
#Show the top number of this stack.
Write-Host "The top of the stack is:" -ForegroundColor green
Write-Host $stack_top -ForegroundColor green

以上这段代码简述了栈的创建和栈顶元素的查看方法。
现在来举个现实世界中的例子,你立刻就会明白什么是栈——发扑克牌。

首先创建一套扑克牌:

#Create a set of pokers.
$pokers = New-Object System.Collections.ArrayList
$pokerModel = @{"pokers"="2,3,4,5,6,7,8,9,10,J,Q,K,A,SmallKing,BigKing";"colors"="spade,heart,club,diamond"}
$pokerEles = $pokerModel.Item("pokers").Split(",")
$pokerColors = $pokerModel.Item("colors").Split(",")
foreach($pokerEle in $pokerEles)
{
if(($pokerEle -eq "SmallKing") -or ($pokerEle -eq "BigKing"))
{
$pokers.Add($pokerEle)
}
else
{
foreach($color in $pokerColors)
{
$newPoker = $color + "_" + $pokerEle
$pokers.Add($newPoker)
}
}
}

然后对这幅扑克进行洗牌(将第一张牌随机放入整副牌中,重复10000次):

#Shuffle.
for($i=0;$i -le 10000;$i++)
{
$randomPlace = Get-Random -min 0 -max $pokers.count
$selectedPoker = $pokers[0]
$pokers.RemoveAt(0)
$pokers.Insert($randomPlace, $selectedPoker)
}

然后我们把洗好的牌放进“栈”中(发牌器就是栈),像下图这个样子。然后开始发牌(每次发牌都是从栈顶pop出一张)——

#Push the cards into the stack.
$myStack = new-object System.Collections.Stack
foreach($poker in $pokers)
{
$myStack.Push($poker)
}
#Start the deal.
Write-Host "---Start dealing---" -ForegroundColor green
$flag = $true
while($flag)
{
$myStack.Pop()
$choice = Read-Host "Press 'c' to continue, any other key to quit"
if($choice -ne 'c')
{
$flag = $false
}
else
{
Write-Host "---Continue dealing---" -ForegroundColor yellow
}
}

运行结果如下:

到此,一个发纸牌的过程就完成了,而这个发牌器就是栈,装牌的过程就是入栈的过程,发牌的过程就是出栈的过程。

栈——PowerShell版的更多相关文章

  1. Ladon内网渗透扫描器PowerShell版

    程序简介 Ladon一款用于大型网络渗透的多线程插件化综合扫描神器,含端口扫描.服务识别.网络资产.密码爆破.高危漏洞检测以及一键GetShell,支持批量A段/B段/C段以及跨网段扫描,支持URL. ...

  2. [工具]法国神器mimikatz 2.1.1 一键版 & PowerShell版

    无需任何参数,运行EXE即可自动读取Windows系统密码 EXE版需要其它功能请使用原版 (参数已写死仅读密码) 结果保存于当前目录mz.log EXE https://github.com/k8g ...

  3. 链表——PowerShell版

    链表是由一系列节点串连起来组成的,每一个节点包括数值部分和指针部分,上一节点的指针部分指向下一节点的数值部分所在的位置. 在C语言中我们有两种方式来定义链表—— 1.定义结构体:来表示链表中的节点,节 ...

  4. 《剑指Offer》附加题_用两个队列实现一个栈_C++版

    在<剑指Offer>中,在栈和队列习题中,作者留下来一道题目供读者自己实现,即"用两个队列实现一个栈". 在计算机数据结构中,栈的特点是后进先出,即最后被压入(push ...

  5. 批量备份数据库脚本(PowerShell版)

    开始 昨天备份一个数据库拿来测试,发现备份后的文件非常大.后来去检查下使用的备份脚本,原来之前的备份脚本没有压缩功能. 现把之前的备份脚本修改下,支持压缩备份,和支持仅复制备份(CopyOnly). ...

  6. LeetCode--255--用队列实现栈(java版)

    使用队列实现栈的下列操作: push(x) -- 元素 x 入栈 pop() -- 移除栈顶元素 top() -- 获取栈顶元素 empty() -- 返回栈是否为空 注意: 你只能使用队列的基本操作 ...

  7. LeetCode--155--最小栈(java版)

    设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. top() -- 获取栈顶元素. ...

  8. 队列——PowerShell版

    继续读啊哈磊<啊哈!算法>感悟系列——队列 地铁售票处排队,先来的人先到队首先买完先走,后来的人排在队尾等候后买完后走. 想买票,必须排在队尾:买完票,只能从队首离开. 这种先进先出(Fi ...

  9. 快速排序——PowerShell版

    继续读啊哈磊算法有感系列,继续升华.上一篇是冒泡排序,在结尾总结了一下冒泡排序的缺点——时间复杂度O(N*N)太大.这一篇来说一下快速排序,快速排序可以在多数情况下克服冒泡排序的缺点(最坏的情况下和冒 ...

随机推荐

  1. UML:包图

    什么是包图?包图是对UML图进行“打包”,按照你期望的方式进行组织的一种图.包图用于展示宏观上的内容.往往利用包图对类进行“打包”,但包图其实可以对任何UML图进行“打包”.包图是逻辑上的概念,你可以 ...

  2. UML: 序列图

    摘自http://www.umlonline.org/school/thread-37-1-1.html 大家都进过餐馆吃饭吧?你是如何和餐厅服务员“眉来眼去”的呢?回忆一下从你进餐馆开始到你离开餐馆 ...

  3. java ajax传值 中文乱码

    String remark =  new String(this.getRequest().getParameter("remark").getBytes("iso885 ...

  4. Java之Structs框架初探

    今天是小白第一次自己的接触Struts框架,因为网上的资料都是从Structs2开始,跟Structs1完全不同,因此,小白直接跳过1学习版本2的搭建,废话不多说,直接开始. 首先要搭建框架,就肯定要 ...

  5. android开发之如何使TabHost的TabWidget位于屏幕下方

    更改TabHost里的第一个LinearLayout为RelativeLayout.并在TabWidget中添加android:layout_alignParentBottom="true& ...

  6. windows系统调用 线程 启动与挂起

    #include "iostream" #include "windows.h" using namespace std; class CWorkerThrea ...

  7. 3D语音天气球(源码分享)——创建可旋转的3D球

    开篇废话: 在9月份时参加了一个网站的比赛,比赛的题目是需要使用第三方平台提供的服务做出创意的作品. 于是我选择使用语音服务,天气服务,Unity3D,Android来制作一个3D语音天气预报,我给它 ...

  8. paper 41:正交变换

    正交变换是保持图形形状和大小不变的几何变换,包含旋转,轴对称及上述变换的复合. 几何意义 正交变换是保持图形形状和大小不变的几何变换,包含旋转,轴对称及上述变换的复合. 代数定义 欧几里得空间V的线性 ...

  9. SqlServer 的提示符(Option/With等提示符)不是什么时候都可以用的

    我们在做SqlServer的查询调优的时候,经常会在语句末尾用到option(loop/merge/hash join)或在join语句前直接声明loop/merge/hash,来强制SqlServe ...

  10. CentOS:安装桌面GNOME图形化界面

    u盘安装dvd版的CentOS7后,没有桌面,浏览器也是黑框版的:如果需要桌面的话,下面三条命令即可:但是安装桌面后,系统会没有之前纯净: 1 安装Gnome包: sudo yum groupinst ...