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 $* # $* 传递给脚本的所有参数