栈——PowerShell版

上一篇讲过队列(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
   }
}

运行结果如下:

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

时间: 2024-07-30 16:49:37

栈——PowerShell版的相关文章

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

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

快速排序——PowerShell版

继续读啊哈磊算法有感系列,继续升华.上一篇是冒泡排序,在结尾总结了一下冒泡排序的缺点——时间复杂度O(N*N)太大.这一篇来说一下快速排序,快速排序可以在多数情况下克服冒泡排序的缺点(最坏的情况下和冒泡排序的时间复杂度一样).下面我们先来说说快速排序的思想与过程,与上一篇从过程到思想的思考方式不同,这一次我们的思考过程是从思想到过程—— 快速排序的思想: 利用二分的思想,先在待排序子数组中选定一个基准数(作为中间值).一个左初始位(待排序子数组的左端点位.若对整个数组进行排序,则左端点位为数组的

队列——PowerShell版

继续读啊哈磊<啊哈!算法>感悟系列——队列 地铁售票处排队,先来的人先到队首先买完先走,后来的人排在队尾等候后买完后走. 想买票,必须排在队尾:买完票,只能从队首离开. 这种先进先出(First In First Out,FIFO),后进后出的线性队伍,就是我们说的——队列. 在现实中,队列里包含的是人,在计算机的队列里,包含的就是数据啦~所以,队列是一种——数据结构. 队列中的三要素为:队伍,队首,队尾. 如果用我们比较熟悉的数组来表示队列的话,队伍就是数组本身,队首和队尾就是数组中相应索引

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

开始 昨天备份一个数据库拿来测试,发现备份后的文件非常大.后来去检查下使用的备份脚本,原来之前的备份脚本没有压缩功能. 现把之前的备份脚本修改下,支持压缩备份,和支持仅复制备份(CopyOnly). 备份数据库(完整备份)脚本 (注:开初编写这脚本的目的是能批量备份数据库,提高工作效率,后面提到的还原数据库脚本也是如此.) <#=====================================================================#> ##备份数据库(完整备份

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

在<剑指Offer>中,在栈和队列习题中,作者留下来一道题目供读者自己实现,即"用两个队列实现一个栈". 在计算机数据结构中,栈的特点是后进先出,即最后被压入(push)栈的元素会第一个被弹出(pop);队列的特点是先进先出,即第一个进入队列的元素将会被第一个弹出来.虽然栈和队列特点是针锋相对,但是两者却相互联系,可以互相转换. 在"用两个队列实现一个栈"问题中,我们用两个队列的压入和弹出来模拟栈的压入和弹出.我们通过画图的手段把抽象的问题形象化. 在上

数据结构之顺序栈(C++版)

#include <iostream>#include <stdlib.h>#define MAXLISTSIZE 100 //预设的存储空间最大容量using namespace std; typedef string ElemType;typedef struct{ ElemType *base; //存储空间基址 int top; //栈顶指针 int stacksize; //允许的最大存储空间以元素为单位}Stack; void InitStack(Stack &

windows基线编写指南-powershell版

前言:   因为工作的原因,要写windows下的基线检查脚本.之前没接触过,在网上找了半天也没找到现成的,无奈只好自己研究,最后还是成功完成了工作. 在我编写之后发现windows下的基线基本就是检查注册表表项.但也有例外.windows组策略有些并不存在于注册表中,那么就要用到组策略命令行工具secedit 在powershell中获取secedit用法 举个例子:如果需要对审核策略进行检查,那我们的思路是先读取审核策略,然后判断是否符合策略,通过 secedit /export /cfg

各种powershell反弹脚本

含(tcp/udp/icmp/dns/http/wmi/http/https) https://github.com/samratashok/nishang/tree/master/Shells 还想再提一下这个项目(powershell版的nc) https://github.com/besimorhino/powercat ## 来源 http://www.labofapenetrationtester.com/2015/05/week-of-powershell-shells-day-1.

[Shell]Powershell反弹shell

原作者:Cream 文章出处: 贝塔安全实验室 0x01 Powershell反弹shell Windows PowerShell 是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用 .NET Framework的强大功能.它引入了许多非常有用的新概念,从而进一步扩展了您在 Windows 命令提示符和 Windows Script Host 环境中获得的知识和创建的脚本. 一旦攻击者可以在一台计算机上运行代码,他们便可以下载powershell脚本文件(.ps1)到磁盘执行,脚本