shell脚本实现堆栈(模拟合服)


shell用数组模拟一个栈,每次弹出来栈顶的最上面两个元素,进行合服。


#!/bin/bash

# test array and stack


MAXTOP=5 #堆栈所能存放元素的最大值
declare TOP=0 #定义栈顶指针,初始值为0

TEMP= #定义一个临时全局变量,存放出栈元素,初始值为空
declare -a STACK #定义一个全局数组

#进栈操作,可以同时将多个元素压入栈顶
function push()
{
    if [ -z "$1" ] #若无输入任何参数,立即返回
    then
        return
    fi
    while [ $# != 0 ] # $#表示参数的个数
    do
        if [ "$TOP" = $MAXTOP ]
        then
            echo "栈已经满了,无法在进行压栈操作"
            return
        fi
        let TOP=TOP+1 #栈顶加1
        STACK[$TOP]=$1 #将第一个参数压入堆栈
        shift #脚本参数左移一位,$#减1
    done
    return
}

#pop函数用于出栈操作
function pop()
{
    TEMP= #清空出栈数据这个临时变量
    if [ "$TOP" = "0" ] #若堆栈为空,无法进行出栈操作
    then
        echo "堆栈为空,无法进行出栈操作"
        return
    fi
    TEMP=${STACK[$TOP]}
    unset STACK[$TOP]
    let TOP=TOP-1
    return
}

#显示当前堆栈内的信息,以及TOP指针
function show_stack()
{
    echo "@@ ----------STACK--------------"
    for i in ${STACK[@]}
    do
        echo "@@ "$i
    done
    echo "@@ stack size = $TOP"
    echo "@@ -----------------------------"
    echo
}


function merge2db()
{
    local db1=$1
    local db2=$2
    local db3=$3
    echo "start merge2db src1 = $db1, src2 = $db2, dst = $db3"
}


function merge()
{
    if [ $TOP -lt 2 ] # 初始时栈中元素不足2个,无法合服
    then
        echo "栈中元素不足2!"
        exit 1
    fi

    # pop 出来2个元素
    # 合服
    # 将生成的新的再push进去
    # 直到栈中只有一个元素
    while(( $TOP > 1 )) # 当栈内至少有2个元素的时候,有1个元素时,表示merge完成
    do
        pop
        local db1=$TEMP
        pop
        local db2=$TEMP
        local dst="($db1""_$db2)"
        merge2db $db1 $db2 $dst
        push $dst
    done
}

function main()
{
    echo "==============main============="
    if [ -z "$1" ] #若无输入任何参数,立即返回
    then
        echo "输入参数为空!"
        exit 1
    fi
    while [ $# != 0 ] # $#表示参数的个数
    do
        push $1 #将第一个参数压入堆栈
        shift #脚本参数左移一位, $#减1
    done

    show_stack
    merge
    return
}

main $*  #  $* 传递给脚本的所有参数



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值