本文目录导读:

我来为您介绍在Shell脚本中实现循环队列的几种方法。
使用数组实现基本的循环队列
#!/bin/bash
# 循环队列实现
class CircularQueue() {
# 初始化队列
declare -a queue
size=0
capacity=10
front=0
rear=-1
count=0
# 入队操作
enqueue() {
local item=$1
if [ $count -eq $capacity ]; then
echo "队列已满,无法入队"
return 1
fi
# 计算rear位置(循环)
rear=$(( (rear + 1) % capacity ))
queue[$rear]=$item
count=$(( count + 1 ))
echo "入队: $item"
}
# 出队操作
dequeue() {
if [ $count -eq 0 ]; then
echo "队列为空,无法出队"
return 1
fi
local item=${queue[$front]}
front=$(( (front + 1) % capacity ))
count=$(( count - 1 ))
echo "出队: $item"
return 0
}
# 查看队首元素
peek() {
if [ $count -eq 0 ]; then
echo "队列为空"
return 1
fi
echo "队首元素: ${queue[$front]}"
}
# 显示所有元素
display() {
if [ $count -eq 0 ]; then
echo "队列为空"
return
fi
echo "队列元素:"
local i=$front
local j=0
while [ $j -lt $count ]; do
echo " [${queue[$i]}]"
i=$(( (i + 1) % capacity ))
j=$(( j + 1 ))
done
}
# 获取队列大小
getSize() {
echo "队列大小: $count"
}
# 清空队列
clear() {
count=0
front=0
rear=-1
echo "队列已清空"
}
}
使用函数封装的循环队列
#!/bin/bash
# 全局变量
declare -a CIRCULAR_QUEUE
QUEUE_CAPACITY=10
QUEUE_FRONT=0
QUEUE_REAR=-1
QUEUE_COUNT=0
# 初始化队列
init_queue() {
local capacity=${1:-10}
QUEUE_CAPACITY=$capacity
QUEUE_FRONT=0
QUEUE_REAR=-1
QUEUE_COUNT=0
echo "队列初始化完成,容量: $QUEUE_CAPACITY"
}
# 判断队列是否为空
is_empty() {
[ $QUEUE_COUNT -eq 0 ]
}
# 判断队列是否已满
is_full() {
[ $QUEUE_COUNT -eq $QUEUE_CAPACITY ]
}
# 入队操作
enqueue() {
local item=$1
if is_full; then
echo "错误: 队列已满"
return 1
fi
QUEUE_REAR=$(( (QUEUE_REAR + 1) % QUEUE_CAPACITY ))
CIRCULAR_QUEUE[$QUEUE_REAR]=$item
QUEUE_COUNT=$(( QUEUE_COUNT + 1 ))
echo "成功入队: $item"
}
# 出队操作
dequeue() {
if is_empty; then
echo "错误: 队列为空"
return 1
fi
local item=${CIRCULAR_QUEUE[$QUEUE_FRONT]}
unset CIRCULAR_QUEUE[$QUEUE_FRONT]
QUEUE_FRONT=$(( (QUEUE_FRONT + 1) % QUEUE_CAPACITY ))
QUEUE_COUNT=$(( QUEUE_COUNT - 1 ))
echo "成功出队: $item"
}
# 打印队列
print_queue() {
if is_empty; then
echo "队列为空"
return
fi
echo "当前队列 (共 $QUEUE_COUNT 个元素):"
local idx=$QUEUE_FRONT
local count=0
while [ $count -lt $QUEUE_COUNT ]; do
echo " [$count]: ${CIRCULAR_QUEUE[$idx]}"
idx=$(( (idx + 1) % QUEUE_CAPACITY ))
count=$(( count + 1 ))
done
}
使用示例
#!/bin/bash
source circular_queue.sh # 导入上面的脚本
# 使用示例
main() {
# 初始化容量为5的循环队列
init_queue 5
# 入队操作
echo "=== 入队操作 ==="
for i in {1..7}; do
enqueue "item_$i"
done
print_queue
echo -e "\n=== 出队操作 ==="
for i in {1..3}; do
dequeue
done
print_queue
echo -e "\n=== 继续入队 ==="
enqueue "new_item_1"
enqueue "new_item_2"
print_queue
# 获取队首元素
echo -e "\n队首元素: ${CIRCULAR_QUEUE[$QUEUE_FRONT]}"
echo "队列状态: $QUEUE_COUNT/$QUEUE_CAPACITY"
}
main
增强版:支持动态扩容
#!/bin/bash
# 动态扩容的循环队列
declare -a DYNAMIC_QUEUE
DYNAMIC_CAPACITY=4
DYNAMIC_FRONT=0
DYNAMIC_REAR=-1
DYNAMIC_COUNT=0
# 扩容操作
resize() {
local old_capacity=$DYNAMIC_CAPACITY
local new_capacity=$(( old_capacity * 2 ))
local new_queue=()
# 复制元素到新数组
local idx=$DYNAMIC_FRONT
local count=0
while [ $count -lt $DYNAMIC_COUNT ]; do
new_queue[$count]=${DYNAMIC_QUEUE[$idx]}
idx=$(( (idx + 1) % old_capacity ))
count=$(( count + 1 ))
done
# 更新全局变量
DYNAMIC_QUEUE=("${new_queue[@]}")
DYNAMIC_CAPACITY=$new_capacity
DYNAMIC_FRONT=0
DYNAMIC_REAR=$(( DYNAMIC_COUNT - 1 ))
echo "队列已扩容到: $new_capacity"
}
# 带自动扩容的入队
dynamic_enqueue() {
local item=$1
# 如果队列满了,自动扩容
if [ $DYNAMIC_COUNT -eq $DYNAMIC_CAPACITY ]; then
resize
fi
DYNAMIC_REAR=$(( (DYNAMIC_REAR + 1) % DYNAMIC_CAPACITY ))
DYNAMIC_QUEUE[$DYNAMIC_REAR]=$item
DYNAMIC_COUNT=$(( DYNAMIC_COUNT + 1 ))
echo "入队: $item (容量: $DYNAMIC_CAPACITY)"
}
性能测试
#!/bin/bash
# 测试循环队列性能
test_performance() {
init_queue 1000
echo "=== 性能测试 ==="
# 测试入队
start_time=$(date +%s%N)
for i in {1..1000}; do
enqueue "data_$i"
done
end_time=$(date +%s%N)
echo "1000次入队耗时: $(( (end_time - start_time) / 1000000 ))ms"
# 测试出队
start_time=$(date +%s%N)
for i in {1..1000}; do
dequeue
done
end_time=$(date +%s%N)
echo "1000次出队耗时: $(( (end_time - start_time) / 1000000 ))ms"
}
使用建议
- 选择合适的容量: 根据业务需求设置初始容量
- 考虑使用关联数组: 对于更大规模的数据,考虑使用关联数组
- 错误处理: 添加完善的错误检查和处理逻辑
- 性能优化: 对于频繁操作,考虑使用临时变量缓存计算结果
这个实现展示了Shell脚本中循环队列的核心概念,包括循环数组、队首队尾指针管理和元素计数等特性。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播