内容正文:
第08讲 字符串、队列与栈
内容导航
01
命题透视·考情前瞻
对标素养,研判高考命题趋势
02
思维建模·脉络梳理
搭建知识框架,构建系统思维
03
考点精讲·靶向突破
拆解核心考点,归纳解题范式
考点一 字符串的基本操作
知识解构 知识点1 字符串的存储与字符访问
知识点2 字符串截取、拼接、查找、替换操作
考向破译 考向1 结合代码,推导字符串截取、遍历后的结果
考向2 字符串处理算法填空,字符位置、下标边界判断
考点二 队列的访问与基本操作
知识解构 知识点1 队列的结构特点:先进先出FIFO
知识点2 队列的基本操作
知识点3 循环队列
考向破译 考向1 给定入队序列,推导出队序列
考向2 循环队列的队头、队尾指针变化判断
考点三 栈的访问与基本操作
知识解构 知识点1 栈的结构特点:后进先出 LIFO
知识点2 入栈、出栈、取栈顶元素操作
考向破译 考向1 给定入栈序列,判断合法出栈序列
考向2 结合代码 / 流程图,考查栈操作过程与结果推演
04
真题溯源·考向感知
溯源真题逻辑,感知高考考向
命题透视·考情前瞻
——对标素养,研判高考命题趋势
考点要求
考查形式
2026年
2025年
2024年
字符串访问与字符操作结果的推演
选择题
非选择题
浙江卷1月卷 T8,2 分;浙江卷6月卷 T9,2 分
浙江卷 1 月卷 T9,2 分;浙江卷 6 月卷 T8,2 分
浙江卷 1月卷 T8,2 分;浙江卷 6月卷 T9,2 分
基于字符串的算法填空与字符处理综合
选择题
非选择题
浙江卷6月卷 T15,9 分
浙江卷 1 月卷 T15,9 分
浙江卷 6月卷 T15,9 分
栈、队列访问与进出序列推演
选择题
非选择题
浙江卷1月卷 T10,2分;
浙江卷6月卷 T11,2 分
浙江卷 1 月卷 T8,2 分;浙江卷 6 月卷 T10,2 分
浙江卷 1月卷 T8,2 分;浙江卷 6月卷 T9,2 分
循环队列指针更新、栈综合应用算法填空
选择题
非选择题
浙江卷1月卷 T15,9 分
浙江卷 6 月卷 T15,9 分
浙江卷 1月卷 T15,9 分
考情分析
1.浙江选考对字符串、栈、队列的考查,重在结合算法推演字符、进出序列、指针状态变化。选择题常考字符串截取遍历、栈合法出栈序列、循环队列指针辨析;综合题(非选择题)借助 Python 代码,考查字符处理、循环队列指针更新、栈典型应用,侧重下标边界与操作先后逻辑。
2.从命题思路上看:
(1)字符串命题思路:聚焦字符遍历、子串截取、字符查找替换,侧重下标边界。命题不单纯考查概念,一般给出文本处理规则 + 残缺 Python 代码,读懂算法功能并补全字符操作语句。
选择题特点:简短代码片段,手动模拟字符循环,判断运行结果或补全代码;
易错点:下标起始位置、截取区间边界;Python 字符串不可原地修改字符,常转为列表处理。
(2)栈与队列命题思路:多用列表模拟栈、队列,核心掌握 LIFO、FIFO 特性;循环队列重点考查头尾指针、判空判满与取模运算。
典型陷阱:循环队列入队出队的指针更新顺序;栈穿插进出序列不能违背后进先出;利用预留空位区分循环队列空、满状态。
(3)字符串、栈、队列辨析常出现在选择题。极少直接默写概念,多嵌入代码情境,考查不同结构访问、增删特性差异。
复习目标
1.理解字符串、栈、队列的逻辑结构与存储特点,分清三者增删、访问规则;
2.熟练掌握 Python 字符串、列表模拟栈 / 队列、循环队列的代码实现;
3.能根据流程图或代码,手动模拟字符遍历、栈进出、循环队列指针变化,推演结果、补全算法代码。
思维建模·脉络梳理
——搭建知识框架,构建系统思维
考点精讲·靶向突破
——拆解核心考点,归纳解题范式
考点一 字符串的基本操作
知●识●解●构
知识点1 字符串的存储与字符访问
1.概念
用单引号或双引号标识的零个或多个字符。
2.特性
(1)有限序列性
(2)字符串可比性
根据ASCII编码方式一一比较。
基础巩固
1.下列关于 Python 字符串概念说法正确的是()
A. 字符串只能用双引号包裹
B. 字符串内至少要有 1 个字符
C. 字符串是零个或多个字符组成,可用单 / 双引号标识
D. 字符串中的字符下标默认从 1 开始
2.已知s1="apple",s2="apply",比较s1>s2结果为()
A. True B. False C. 报错 D. 无法比较
知识点2 字符串截取、拼接、查找、替换操作
1.子串判断
语法:sub in s
含义:判断字符串sub是否连续存在于字符串s中。
返回值:布尔值 True / False
sub not in s:判断 sub不存在于 s 中,存在返回 False,不存在返回 True
例:s = "information"
print("form" in s) # True,"form"连续出现在s里
print("imn" in s) # False,i、m、n不连续
2.求子串
切片——s[start:end:step]
[:]提取从开头(默认位置0)到结尾(默认位置-1)的整个字符串
[start:]从start 提取到结尾
[:end]从开头提取到end-1
[start:end]从start 提取到end-1
[start:end:step]从start 提取到end-1,每step个字符提取一个
例:
3.字符串运算符
+号运算
*号运算
s1='Hello,'
s2='World!'
s=s1+s2
print(s)
s1='Hello,'
s=s1*3
print(s)
运行结果:
运行结果:
4.字符串常用函数和方法
s=“I like python”
函数和方法
功能
结果
len(s)
求字符串长度
13
s.find(“i”)
返回字符首次出现的下标
3
s.split(str=“ ”)
以str分隔符切片
[“I”, “like”, “python”]
s.replace(“ike”,“ove”,1)
用新字符串替换旧字符串
I love python
s.upper()
把小写字母转换成大写字母
I LIKE PYTHON
s.lower()
把大写字母转换成小写字母
i like python
高频易错点
1.子串必须连续
2.比较是逐字符 ASCII,不是整体数字大小
3.切片左闭右开
4.字符串不可原地修改,操作都产生新串
考●向●破●译
考向1 结合代码,推导字符串截取、遍历后的结果
例1 【北斗星盟 2025‑12 第 10 题,字符串切片s[i:j]截取,回文判断】
s = input()
i,j,k = 0, len(s)-1, 0
while i<j:
if s[i] != s[j]:
t1 = s[i:j]
t2 = s[i+1:j+1]
if t1 == t1[::-1] or t2 == t2[::-1]:
k = 1
break
i +=1
j -=1
运行结束后k=1,输入s可能是()
A.DACAAC B.ABCDECA C.CAADBBAC D.BCBAACB
【变式1】 【新阵地联盟 2026‑03 第 9 题,遍历字符、条件拼接字符串】
res,i,t = "",0,1
s=input()
while i<len(s) and t>=0:
ch = s[i]
if ch == '@':
t -=1
elif ch == '$':
t +=1
else:
res += ch
i += 1
题目:若输入s="a@bc@d@e",执行后res的值为()
A."abc" B."abcd" C."ab" D."a"
考向2 字符串处理算法填空,字符位置、下标边界判断
例1 【慈溪 2025‑01 期末 第 13 题|统计字母异构单词类别】
小明为了记忆单词,设计了一种单词分类方法:两个单词可以分为一类当且仅当组成这两个单词的各个字母的数量均相等。例如单词"cat",它和单词"tea"可以归为一类,但和单词"car就不是一类。所有单词均由小写字母组成。现要统计需要记忆的单词可以被分成几类。请回答下列问题:
(1)假设小明要记忆的单词为["able","ably","bale","last"],则可以将这些单词分成 ▲ 类。
(2)所有需要记忆的单词存储在文本文件“单词.txt”中,每行一个单词。实现上述功能的部分 Python程序如下,请在划线处填入合适的代码。
def types(s):
d=[0]*26
for t in s: #统计每个字母出现的次数
______①______
s1=""
#重新按照字母表顺序拼接,good → dgoo
for i in range(len(d)):
if d[i]>0:
s1+= ______②______
return s1
f=open("单词.txt","r")
lst=[]
for line in f.readlines():
s=line.strip() #去除换行符
if ______③______:
continue
lst.append(types(s))
print("一共有"+str(len(lst))+"类单词")
(2) 补全①②③三处代码。
(3) 若将③处修改为 break,对结果____影响(A. 有 B. 无)。
【变式1】【溪 2025‑01 期末 第 15 题 remove 函数|从方程字符串提取系数】
功能:remove (fc),输入方程字符串如 "3x+y=34",返回 (3,1,34)。
def remove(fc):
abc=[0,0,0]
h=["+","="]
s=''
i=0
for c in fc:
if c not in h:
s=s+c
else:
if len(s)==1:
abc[i]=1
else:
____________ #①
s=''
i=i+1
return abc[0],abc[1],abc[2]
考点二 队列的访问与基本操作
知●识●解●构
知识点1 队列的结构特点:先进先出FIFO
1.基本概念:是一种“先进先出”的线性表,允许插入的一端称为队尾,插入叫入队,允许删除的一端称为队首,删除叫出队,队列中的数据称为队列元素。
a1 优先入队,紧接着 a2、a3...an 按照顺序依次进入
2.特性
(1)先进先出、后进后出
元素入队顺序和元素出队顺序一致。
(2)有限序列性
①队列元素个数有限。
②队列可以是空的,也可以包含多个元素。
③队列中所有元素呈现线性特征,队首元素只有一个后继点,队尾元素只有一个前驱点,其他元素既有一个前驱点,又有一个后继点。
基础巩固
1. 若元素 a1、a2、a3、a4 依次入队,则正常出队顺序是()
A. a1,a2,a3,a4
B. a4,a3,a2,a1
C. a2,a1,a4,a3
D. 顺序不确定
2. 在队列中,删除元素的操作称为出队,出队发生在()
A. 队尾
B. 队首
C. 任意位置
D. 队中间
已知队列依次入队:A、B、C,执行一次出队操作后,队列剩余元素为()
A. A、B
B. B、C
C. A、C
D. A、B、C
知识点2 队列的基本操作
3.基本操作
①队列的创建(以数组结构实现)
head = 0
tail = 0
que = [""]*5
队列中元素个数=tail-head
有4个字母“A”“B”“C”“D”按序入队,可创建长度为5的队列que
队列的head、tail指针变化图
②入队、出队
入队
出队
s=input('请输入一个字符串:')
for i in s:
que[tail]=i
tail+=1
print(que)
while head!=tail:
print(que[head],end=’’)
head += 1
运行结果:
运行结果:
③队列构造的常用方法
知识点3 循环队列
循环队列是将队列的队首和队尾连接起来,形成逻辑上的环状结构。
*若最大容量为n的循环队列,队首是head,队尾是tail,则
(1)队列为空的条件:head==tail
(2)队列为满的条件:(tail+1)%n==head (说明:循环队列满时,会留出一个空间,这样有便于和队列为空时做区分)
(3)队列长度:qsize=(tail-head+n)%n
(4)入队:tail=(tail+1)%n
(5)出队:head=(head+1)%n
*Python自带的队列模块
import queue
引用队列模块
q=queue.queue(10)
建一个长度为10的队列q
q.put("A")
字母“A”入队
q.put("B")
字母“B”入队
print(q.qsize())
输出队列中元素的个数,个数为2
print(q.get())
队首元素出队,出队元素为“A”
print(q.qsize())
输出队列中元素的个数,个数为1
考●向●破●译
考向1 给定入队序列,推导出队序列
例1【湖州 2025‑01 高二期末 第 8 题|普通队列操作模拟】
队列 Q 从队首到队尾的元素依次是"春"、"夏"、"秋"、"冬"。
约定:T 操作:Q 中 1 个元素出队;R 操作:Q 中 1 个元素出队后,再将该元素重新入队。
经过TRTRRT系列操作后,队列中队首元素是()
A."春" B."夏" C."秋" D."冬"
【变式1】【县域教研联盟 202312 第 12 题|队列 + 字符串综合,模拟进出队】
s="Jishu1234"
st=[]
q=[0]*20
head=0; tail=0
for i in range(len(s)):
if "0"<=s[i]<="9":
st.append(int(s[i]))
elif "a"<=s[i]<="z":
q[tail]=s[i]
tail+=1
key=st.pop()
q[tail]=chr((ord(q[head])-97-key)%26+97)
tail+=1;head+=1
执行该程序段后,队列中队首到队尾的元素依次为()
A.epft B.hqeq C.mvjv D.epgs
考向2 循环队列的队头、队尾指针变化判断
例1【浙南名校联盟高二下 4 月期中|选择题】
用数组存储循环队列,存储空间是 6,head 指向队首元素所在位置,tail 指向队尾元素后一个位置,初始队列有 2 个元素,head=0,tail=2。现执行以下操作:入队,入队,入队,出队 3 个元素,入队,出队 2 个元素。此时队列 head 和 tail 为()
A. 5,0 B. 4,1 C. 5,6 D. 0,1
【变式1】【学军中学高二 5 月月考|选择题,代码片段】
n=5
que=['a','b','c','d','e']
head = 0
tail= 4
while head!=tail:
if head%4==0:
print(que[head])
else:
tail=(tail+1) %n
que[tail] =que[head]
head=(head+1)%n
print(que[head])
长度为 5 的循环队列 que,que [0] 至 que [4] 的值依次为'a','b','c','d','e',执行如上程序段后,输出的最后一个字符为()
A.a B.b C.d D.e
易混易错
1. 普通队列遵循 FIFO 先进先出,只能队尾入队、队首出队,不能操作中间元素。
2. 普通队列 head 代表队首下标,tail 指向队尾后一位;入队动 tail,出队动 head。
3. 普通队列会产生假溢出,这正是循环队列要解决的问题。
4. 做循环队列题目,第一步必须看清题干 head、tail 的定义,切勿死套公式。
5. 主流定义:tail 指向队尾后一位,预留一个空位区分队列空和满。
6. 循环队列入队:先存数据,再把 tail 对总容量取模后更新。
7. 循环队列出队:先读取 head 位置元素,再更新 head,同样要做取模运算。
考点三 栈的访问与基本操作
知●识●解●构
知识点1 栈的结构特点:后进先出 LIFO
1.基本概念:是一种“先进后出”的线性表,仅允许在表的一端进行插入或删除。进行插入或删除操作的一端称为栈顶,位于栈顶位置的元素称为栈顶元素;相应地,将表的另一端称为栈底,位于栈底位置的元素为栈底元素。
2.特性
(1)先进后出、后进先出
(2)有限序列性
①栈元素个数有限。
②栈可以是空的,也可以包含多个元素。
③栈中所有元素呈现线性特征,栈顶元素有一个前驱点,栈底元素有一个后继点,其他元素既有一个前驱点,又有一个后继点。
知识点2 入栈、出栈、取栈顶元素操作
①创建(以数组结构实现):
【例】有4个字母“A”“B”“C”“D”按序入栈,可创建长度为4的栈
top=-1
st = [""]*4
②入栈、出栈
入栈
出栈
s=input('请输入一个字符串:')
for i in s:
top+=1
st[top]=i
print(st)
while top!=-1:
print(st[top],end='')
top=top-1
运行结果:
运行结果:
③数组和列表实现的栈的基本操作
4.栈的应用实例
例1.进制转换
程序
st = [-1]*100 #表中元素初始值-1
top = -1
number = int(input("请输入十进制整数:"))
while number > 0:
x=number % 2
top = top+1
st[top] = x # 入栈
number=number//2
while top >= 0:
print(st[top],end="") # 出栈
top=top-1
运行结果:
例2.括号匹配
程序
st = [""]*100
top=-1
flag=True # 标记是否有不匹配的情况
s = input("请输入数学计算式:")
for i in range(len(s)):
if s[i]=="(":
top = top+1
st[top] = s[i]
elif s[i] == ")":
if top == -1:
flag = False
break
else:
top = top-1
if top >= 0: # 中还有左括号
flag = False
if flag:
print("括号匹配")
else:
print("括号不匹配")
运行结果:
例3.逆波兰表达式
在数学常规表达式里,运算符写在两个运算对象(本题均为一位正整数)的中间;求值时,需要处理括号并遵守运算符优先级。
为方便程序计算,波兰逻辑学家 J.Lukasiewicz 提出了一种新表达式写法:运算符放在运算对象的后面。该形式不需要括号,也不用额外考虑运算符优先级,称为后缀表达式,也叫逆波兰表达式。
举例:后缀表达式6 8 2 - 2 * 3 ÷ +,对应中缀表达式 (6+(8-2)*2\3)。
st=[0]*100
top=-1
s=input('请输入逆波兰表达式:')
i=0
while i<len(s):
if '0'<=s[i]<='9':
top+=1
st[top]=int(s[i])
else:
x=st[top];top-=1
y=st[top];top-=1
if s[i]=='+':
top+=1;st[top]=x+y
elif s[i] == '-':
top+=1;st[top]=y-x
elif s[i]=='*':
top+=1;st[top]=x*y
else:
top+=1;st[top]=int(y/x)
i=i+1
print(st[top])
利用栈求逆波兰表达式的方法是:
从左往右扫描该表达式,遇到操作数时入栈;遇到运算符时,把处于栈上方的两个元素依次出栈,用运算符计算,并把计算结果压入栈中。如此反复操作,直至表达式扫描结束。
5.用列表自带的函数和方法实现的栈
stacklist=[]
建立一个空栈list
stacklist.append("A")
建一个长度为10的队列q
stacklist.append("B")
字母“A”入队
print(stacklist[1])
字母“B”入队
print(len(stacklist))
输出队列中元素的个数,个数为2
stacklist.pop()
队首元素出队,出队元素为“A”
print(len(stacklist))
输出队列中元素的个数,个数为1
考●向●破●译
考向1 给定入栈序列,判断合法出栈序列
例1 【杭州高二期末】
若元素入栈的顺序为 “琴”“棋”“书”“画”,其中 “书” 第一个出栈,则下列说法正确的是( )
A. “画” 一定在 “棋” 之后出栈
B. “琴” 一定在 “棋” 之后出栈
C. “棋” 可以最后一个出栈
D. “琴” 可以第二个出栈
【变式1】【新阵地联盟联考】元素 A,B,C,D 依次入栈(入栈和出栈可穿插进行),下列出栈序列不可能实现的是()
A. A,B,C,D B. B,A,D,C C. D,C,A,B D. B,C,A,D
【变式2】【浙江县域教研联盟|原题】
栈初始为空,入栈序列:1,2,3,4,5。下面哪个出栈序列不可能成立()
A. 2,1,4,5,3 B. 3,2,1,5,4 C. 1,5,2,4,3 D. 2,3,5,4,1
考向2 结合代码 / 流程图,考查栈操作过程与结果推演
例1 【金华卓越联盟高三 10 月 选择题原题】
s= "abac"
st=[]
res=""
for ch in s:
if ch not in st:
st.append(ch)
res+=ch
else:
while st[-1]!=ch:
res+=st.pop()
res+=st.pop()
print(res)
执行该程序段后,输出的结果是()
A. abac B. abba C. abca D. abcb
【变式1】【湖州 2025.01 期末 选择题原题】
data=[2,6,3,7,1]
stack=[]
ans=[]
for num in data:
while stack and stack[-1]<num:
ans.append(stack.pop())
stack.append(num)
while stack:
ans.append(stack.pop())
print(ans)
运行程序段后,列表 ans 输出为( )
A. [2,3,6,1,7] B. [2,6,3,1,7] C. [2,3,1,6,7] D. [2,3,1,7,6]
真题溯源·考向感知
——溯源真题逻辑,感知高考考向
1.【2024 年 1 月浙江选考第 8 题】
栈 S 从栈底到栈顶的元素依次为 1,2,3,队列 Q 初始为空。约定:U 操作是指元素出栈后入队,H 操作是指元素出队后再入队。经过 UUHU 系列操作后,队列中队首到队尾的元素依次为()
A. 2,1,3 B. 3,1,2 C. 1,3,2 D. 2,3,1
2.【2026 年 1 月浙江选考第 8 题】
队列初始为空,字符 “甲”“乙”“丙”“丁”“戊”“己” 依次入队的规则为:若队列为空,字符入队;否则队首元素出队后再入队,然后字符入队,重复执行直到字符全部入队。字符全部入队后,队首元素为()
A. 丁 B. 己 C. 甲 D. 乙
3.【2026 年 6 月浙江选考第 8 题】
栈初始为空,经过一系列入栈、出栈操作后,栈又为空。若元素入栈的顺序为 1,2,3,4,5,6,7,且每个元素入栈 1 次,最后出栈的两个元素为 5 和 2,则对于所有可行的方案,操作过程中栈内元素个数最多为()
A.3 B.4 C.5 D.6
4.【2024 年 1 月浙江选考第 11 题】
若字符串 s 的值为 "abcde",执行如下程序段后,变量 res 的值不可能是
from random import randint
res=""
i,j=0,len(s)-1
while i<len(s) and j>=i:
if randint(0,1) == 0: #randint(0,1)随机生成0或1
res+=s[i]
i+=1
else:
res+=s[j]
j-=1
A."abced" B."aecbd" C."aedbc" D."edcba"
5.【2026 年 1 月浙江选考第 10 题】
c,i="",0
while i<len(s)and t>=0:
if s[i]=="e":
t-=1
else:
c+=s[i]
i+=1
若 s 为 "keeper",t 为 2,执行该程序段后,c 的值为()
A."k" B."kp" C."kpr" D."kper"
6.【2026 年 6 月浙江选考第 10 题】
i=len(s)-1
while i>= 0 and c=="*":
if "0"<=s[i]<="9":
c=s[i]
else:
i=i-1
若 c 和 s 的初始值分别为 "*"和"172D6AF",执行该程序段后,c 的值为()
A."*" B."1" C."2" D."6"
2 / 3
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
第08讲 字符串、队列与栈
内容导航
01
命题透视·考情前瞻
对标素养,研判高考命题趋势
02
思维建模·脉络梳理
搭建知识框架,构建系统思维
03
考点精讲·靶向突破
拆解核心考点,归纳解题范式
考点一 字符串的基本操作
知识解构 知识点1 字符串的存储与字符访问
知识点2 字符串截取、拼接、查找、替换操作
考向破译 考向1 结合代码,推导字符串截取、遍历后的结果
考向2 字符串处理算法填空,字符位置、下标边界判断
考点二 队列的访问与基本操作
知识解构 知识点1 队列的结构特点:先进先出FIFO
知识点2 队列的基本操作
知识点3 循环队列
考向破译 考向1 给定入队序列,推导出队序列
考向2 循环队列的队头、队尾指针变化判断
考点三 栈的访问与基本操作
知识解构 知识点1 栈的结构特点:后进先出 LIFO
知识点2 入栈、出栈、取栈顶元素操作
考向破译 考向1 给定入栈序列,判断合法出栈序列
考向2 结合代码 / 流程图,考查栈操作过程与结果推演
04
真题溯源·考向感知
溯源真题逻辑,感知高考考向
命题透视·考情前瞻
——对标素养,研判高考命题趋势
考点要求
考查形式
2026年
2025年
2024年
字符串访问与字符操作结果的推演
选择题
非选择题
浙江卷1月卷 T8,2 分;浙江卷6月卷 T9,2 分
浙江卷 1 月卷 T9,2 分;浙江卷 6 月卷 T8,2 分
浙江卷 1月卷 T8,2 分;浙江卷 6月卷 T9,2 分
基于字符串的算法填空与字符处理综合
选择题
非选择题
浙江卷6月卷 T15,9 分
浙江卷 1 月卷 T15,9 分
浙江卷 6月卷 T15,9 分
栈、队列访问与进出序列推演
选择题
非选择题
浙江卷1月卷 T10,2分;
浙江卷6月卷 T11,2 分
浙江卷 1 月卷 T8,2 分;浙江卷 6 月卷 T10,2 分
浙江卷 1月卷 T8,2 分;浙江卷 6月卷 T9,2 分
循环队列指针更新、栈综合应用算法填空
选择题
非选择题
浙江卷1月卷 T15,9 分
浙江卷 6 月卷 T15,9 分
浙江卷 1月卷 T15,9 分
考情分析
1.浙江选考对字符串、栈、队列的考查,重在结合算法推演字符、进出序列、指针状态变化。选择题常考字符串截取遍历、栈合法出栈序列、循环队列指针辨析;综合题(非选择题)借助 Python 代码,考查字符处理、循环队列指针更新、栈典型应用,侧重下标边界与操作先后逻辑。
2.从命题思路上看:
(1)字符串命题思路:聚焦字符遍历、子串截取、字符查找替换,侧重下标边界。命题不单纯考查概念,一般给出文本处理规则 + 残缺 Python 代码,读懂算法功能并补全字符操作语句。
选择题特点:简短代码片段,手动模拟字符循环,判断运行结果或补全代码;
易错点:下标起始位置、截取区间边界;Python 字符串不可原地修改字符,常转为列表处理。
(2)栈与队列命题思路:多用列表模拟栈、队列,核心掌握 LIFO、FIFO 特性;循环队列重点考查头尾指针、判空判满与取模运算。
典型陷阱:循环队列入队出队的指针更新顺序;栈穿插进出序列不能违背后进先出;利用预留空位区分循环队列空、满状态。
(3)字符串、栈、队列辨析常出现在选择题。极少直接默写概念,多嵌入代码情境,考查不同结构访问、增删特性差异。
复习目标
1.理解字符串、栈、队列的逻辑结构与存储特点,分清三者增删、访问规则;
2.熟练掌握 Python 字符串、列表模拟栈 / 队列、循环队列的代码实现;
3.能根据流程图或代码,手动模拟字符遍历、栈进出、循环队列指针变化,推演结果、补全算法代码。
思维建模·脉络梳理
——搭建知识框架,构建系统思维
考点精讲·靶向突破
——拆解核心考点,归纳解题范式
考点一 字符串的基本操作
知●识●解●构
知识点1 字符串的存储与字符访问
1.概念
用单引号或双引号标识的零个或多个字符。
2.特性
(1)有限序列性
(2)字符串可比性
根据ASCII编码方式一一比较。
基础巩固
1.下列关于 Python 字符串概念说法正确的是()
A. 字符串只能用双引号包裹
B. 字符串内至少要有 1 个字符
C. 字符串是零个或多个字符组成,可用单 / 双引号标识
D. 字符串中的字符下标默认从 1 开始
答案:C
解析:字符串可用单引号或双引号标识,可以是空字符串(0 个字符);Python 字符串下标从 0 开始。A 错(单引号也可以),B 错(允许空串),D 错。
2.已知s1="apple",s2="apply",比较s1>s2结果为()
A. True B. False C. 报错 D. 无法比较
答案:B
解析:字符串按照 ASCII 码逐位比较。前 4 个字符a p p l都相同,第 5 位:e的 ASCII 码小于y,因此"apple"<"apply",s1>s2结果为 False。
知识点2 字符串截取、拼接、查找、替换操作
1.子串判断
语法:sub in s
含义:判断字符串sub是否连续存在于字符串s中。
返回值:布尔值 True / False
sub not in s:判断 sub不存在于 s 中,存在返回 False,不存在返回 True
例:s = "information"
print("form" in s) # True,"form"连续出现在s里
print("imn" in s) # False,i、m、n不连续
2.求子串
切片——s[start:end:step]
[:]提取从开头(默认位置0)到结尾(默认位置-1)的整个字符串
[start:]从start 提取到结尾
[:end]从开头提取到end-1
[start:end]从start 提取到end-1
[start:end:step]从start 提取到end-1,每step个字符提取一个
例:
3.字符串运算符
+号运算
*号运算
s1='Hello,'
s2='World!'
s=s1+s2
print(s)
s1='Hello,'
s=s1*3
print(s)
运行结果:
运行结果:
4.字符串常用函数和方法
s=“I like python”
函数和方法
功能
结果
len(s)
求字符串长度
13
s.find(“i”)
返回字符首次出现的下标
3
s.split(str=“ ”)
以str分隔符切片
[“I”, “like”, “python”]
s.replace(“ike”,“ove”,1)
用新字符串替换旧字符串
I love python
s.upper()
把小写字母转换成大写字母
I LIKE PYTHON
s.lower()
把大写字母转换成小写字母
i like python
高频易错点
1.子串必须连续
2.比较是逐字符 ASCII,不是整体数字大小
3.切片左闭右开
4.字符串不可原地修改,操作都产生新串
考●向●破●译
考向1 结合代码,推导字符串截取、遍历后的结果
例1 【北斗星盟 2025‑12 第 10 题,字符串切片s[i:j]截取,回文判断】
s = input()
i,j,k = 0, len(s)-1, 0
while i<j:
if s[i] != s[j]:
t1 = s[i:j]
t2 = s[i+1:j+1]
if t1 == t1[::-1] or t2 == t2[::-1]:
k = 1
break
i +=1
j -=1
运行结束后k=1,输入s可能是()
A.DACAAC B.ABCDECA C.CAADBBAC D.BCBAACB
答案:D
解析:
- s[i:j]:左闭右开,截取索引i~j‑1;s[i+1:j+1]截取i+1 ~ j。
- 逻辑:两端字符不等时,尝试删掉左边一个字符(取 t1)或删掉右边一个字符(取 t2),如果其中一段是回文,则 k 赋值为 1。
- D 选项BCBAACB,i=0,j=6:B 与 B 相等;i=1,j=5:C 和 C 相等;i=2,j=4:B≠A。
t1=s[2:4]="BA";t2=s[3:5]="AA","AA"是回文,条件成立,k=1。
> 核心易错:Python 切片s[a:b]包含 a,不包含 b,是浙江选考字符串高频陷阱。
【变式1】 【新阵地联盟 2026‑03 第 9 题,遍历字符、条件拼接字符串】
res,i,t = "",0,1
s=input()
while i<len(s) and t>=0:
ch = s[i]
if ch == '@':
t -=1
elif ch == '$':
t +=1
else:
res += ch
i += 1
题目:若输入s="a@bc@d@e",执行后res的值为()
A."abc" B."abcd" C."ab" D."a"
答案:C
解析:
t初始 = 1;@使 t‑1,$使 t+1;只有 t≥0 才继续循环;不是 @/$ 的字符才拼接到 res。
i=0 ch='a' → res="a",i=1
i=1 ch='@' → t=0,i=2
i=2 ch='b' → res="ab",i=3
i=3 ch='c' → res="abc",i=4
i=4 ch='@' → t =‑1,循环条件 t>=0 不满足,直接退出。
res 最终 ="ab"。
> 易错点:循环终止条件i<len(s) and t>=0,t 变成‑1 立刻结束,后面字符不再处理。
考向2 字符串处理算法填空,字符位置、下标边界判断
例1 【慈溪 2025‑01 期末 第 13 题|统计字母异构单词类别】
小明为了记忆单词,设计了一种单词分类方法:两个单词可以分为一类当且仅当组成这两个单词的各个字母的数量均相等。例如单词"cat",它和单词"tea"可以归为一类,但和单词"car就不是一类。所有单词均由小写字母组成。现要统计需要记忆的单词可以被分成几类。请回答下列问题:
(1)假设小明要记忆的单词为["able","ably","bale","last"],则可以将这些单词分成 ▲ 类。
(2)所有需要记忆的单词存储在文本文件“单词.txt”中,每行一个单词。实现上述功能的部分 Python程序如下,请在划线处填入合适的代码。
def types(s):
d=[0]*26
for t in s: #统计每个字母出现的次数
______①______
s1=""
#重新按照字母表顺序拼接,good → dgoo
for i in range(len(d)):
if d[i]>0:
s1+= ______②______
return s1
f=open("单词.txt","r")
lst=[]
for line in f.readlines():
s=line.strip() #去除换行符
if ______③______:
continue
lst.append(types(s))
print("一共有"+str(len(lst))+"类单词")
(2) 补全①②③三处代码。
(3) 若将③处修改为 break,对结果____影响(A. 有 B. 无)。
【答案】 (1) 3 (2) ①d [ord (t)-ord ('a')] += 1;②chr (i+ord ('a'))*d [i];③len (s)==0 (3) A
【解析】
ord (t)-ord ('a') 把小写字母映射数组下标 025;
range (len (d)) 循环边界 0~25;
line.strip () 之后要判断空字符串,防止下标访问报错;
break 直接终止循环,continue 跳过本条记录,边界逻辑不同。
【变式1】【溪 2025‑01 期末 第 15 题 remove 函数|从方程字符串提取系数】
功能:remove (fc),输入方程字符串如 "3x+y=34",返回 (3,1,34)。
def remove(fc):
abc=[0,0,0]
h=["+","="]
s=''
i=0
for c in fc:
if c not in h:
s=s+c
else:
if len(s)==1:
abc[i]=1
else:
____________ #①
s=''
i=i+1
return abc[0],abc[1],abc[2]
【答案:①abc [i]=int (s)】
【解析】
1. i 作为数组 abc 下标,取值只能 0,1,2;遇到 "+"、"=" 触发赋值;
2. 当系数省略(如 x+y=34,x 前面无数字,s 长度为 1),直接赋值 abc [i]=1;
3. 易错:循环遍历字符串字符,依靠分隔符控制下标 i,不能越界。
考点二 队列的访问与基本操作
知●识●解●构
知识点1 队列的结构特点:先进先出FIFO
1.基本概念:是一种“先进先出”的线性表,允许插入的一端称为队尾,插入叫入队,允许删除的一端称为队首,删除叫出队,队列中的数据称为队列元素。
a1 优先入队,紧接着 a2、a3...an 按照顺序依次进入
2.特性
(1)先进先出、后进后出
元素入队顺序和元素出队顺序一致。
(2)有限序列性
①队列元素个数有限。
②队列可以是空的,也可以包含多个元素。
③队列中所有元素呈现线性特征,队首元素只有一个后继点,队尾元素只有一个前驱点,其他元素既有一个前驱点,又有一个后继点。
基础巩固
1. 若元素 a1、a2、a3、a4 依次入队,则正常出队顺序是()
A. a1,a2,a3,a4
B. a4,a3,a2,a1
C. a2,a1,a4,a3
D. 顺序不确定
答案:A
解析:队列先进先出,入队和出队顺序保持一致。
2. 在队列中,删除元素的操作称为出队,出队发生在()
A. 队尾
B. 队首
C. 任意位置
D. 队中间
答案:B
解析:队列在队首执行删除(出队)操作。
已知队列依次入队:A、B、C,执行一次出队操作后,队列剩余元素为()
A. A、B
B. B、C
C. A、C
D. A、B、C
答案:B
解析:出队删除队首 A,剩下 B、C。
知识点2 队列的基本操作
3.基本操作
①队列的创建(以数组结构实现)
head = 0
tail = 0
que = [""]*5
队列中元素个数=tail-head
有4个字母“A”“B”“C”“D”按序入队,可创建长度为5的队列que
队列的head、tail指针变化图
②入队、出队
入队
出队
s=input('请输入一个字符串:')
for i in s:
que[tail]=i
tail+=1
print(que)
while head!=tail:
print(que[head],end=’’)
head += 1
运行结果:
运行结果:
③队列构造的常用方法
知识点3 循环队列
循环队列是将队列的队首和队尾连接起来,形成逻辑上的环状结构。
*若最大容量为n的循环队列,队首是head,队尾是tail,则
(1)队列为空的条件:head==tail
(2)队列为满的条件:(tail+1)%n==head (说明:循环队列满时,会留出一个空间,这样有便于和队列为空时做区分)
(3)队列长度:qsize=(tail-head+n)%n
(4)入队:tail=(tail+1)%n
(5)出队:head=(head+1)%n
*Python自带的队列模块
import queue
引用队列模块
q=queue.queue(10)
建一个长度为10的队列q
q.put("A")
字母“A”入队
q.put("B")
字母“B”入队
print(q.qsize())
输出队列中元素的个数,个数为2
print(q.get())
队首元素出队,出队元素为“A”
print(q.qsize())
输出队列中元素的个数,个数为1
考●向●破●译
考向1 给定入队序列,推导出队序列
例1【湖州 2025‑01 高二期末 第 8 题|普通队列操作模拟】
队列 Q 从队首到队尾的元素依次是"春"、"夏"、"秋"、"冬"。
约定:T 操作:Q 中 1 个元素出队;R 操作:Q 中 1 个元素出队后,再将该元素重新入队。
经过TRTRRT系列操作后,队列中队首元素是()
A."春" B."夏" C."秋" D."冬"
答案:D
解析
初始队列:队首【春,夏,秋,冬】队尾
1. T:出队春 →队列【夏,秋,冬】
2. R:出队夏,再入队夏 →队列【秋,冬,夏】
3. T:出队秋 →队列【冬,夏】
4. R:出队冬,再入队冬 →队列【夏,冬】
5. R:出队夏,再入队夏 →队列【冬,夏】
6. T:出队冬 →队列【夏】
【变式1】【县域教研联盟 202312 第 12 题|队列 + 字符串综合,模拟进出队】
s="Jishu1234"
st=[]
q=[0]*20
head=0; tail=0
for i in range(len(s)):
if "0"<=s[i]<="9":
st.append(int(s[i]))
elif "a"<=s[i]<="z":
q[tail]=s[i]
tail+=1
key=st.pop()
q[tail]=chr((ord(q[head])-97-key)%26+97)
tail+=1;head+=1
执行该程序段后,队列中队首到队尾的元素依次为()
A.epft B.hqeq C.mvjv D.epgs
答案:D
解析
1. 入队元素来自字符串s="Jishu1234"中小写字母;数字压入列表 st 充当临时栈。
2. 每读到一个小写字母:字母入队 (tail+1),再弹出栈中数字 key,计算得到新字符再入队。
3. head 是队首指针,tail 是队尾指针;队列遵循 FIFO 先进先出,最终从 head 开始读取队首到队尾结果epgs。
考向2 循环队列的队头、队尾指针变化判断
例1【浙南名校联盟高二下 4 月期中|选择题】
用数组存储循环队列,存储空间是 6,head 指向队首元素所在位置,tail 指向队尾元素后一个位置,初始队列有 2 个元素,head=0,tail=2。现执行以下操作:入队,入队,入队,出队 3 个元素,入队,出队 2 个元素。此时队列 head 和 tail 为()
A. 5,0 B. 4,1 C. 5,6 D. 0,1
答案:A
解析:存储空间为 6,数组下标范围 0~5;
入队操作:tail=(tail+1)%6;出队操作:head=(head+1)%6
初始状态:head=0,tail=2
1. 3 次入队:tail=(2+1)%6=3 → tail=4 → tail=5
2. 3 次出队:head=(0+1)%6=1 → head=2 → head=3
3. 1 次入队:tail=(5+1)%6=0
4. 2 次出队:head=(3+1)%6=4 → head=5
最终 head=5,tail=0。
【变式1】【学军中学高二 5 月月考|选择题,代码片段】
n=5
que=['a','b','c','d','e']
head = 0
tail= 4
while head!=tail:
if head%4==0:
print(que[head])
else:
tail=(tail+1) %n
que[tail] =que[head]
head=(head+1)%n
print(que[head])
长度为 5 的循环队列 que,que [0] 至 que [4] 的值依次为'a','b','c','d','e',执行如上程序段后,输出的最后一个字符为()
A.a B.b C.d D.e
答案:C
解析
队列容量 n=5,head! = tail为循环继续条件;head=(head+1)%n更新队头,tail=(tail+1)%n更新队尾。
1. head=0,head%4==0,打印 que [0] 即 'a';head 变为 1
2. head=1,head%4≠0;tail=(4+1)%5=0;que [0]=que [1]='b';head 变为 2
3. head=2,head%4≠0;tail=(0+1)%5=1;que [1]=que [2]='c';head 变为 3
4. head=3,head%4≠0;tail=(1+1)%5=2;que [2]=que [3]='d';head 变为 4
此时 head==tail,退出 while 循环;执行 print (que [head]) 即 print (que [4]) 输出 'd'。
易混易错
1. 普通队列遵循 FIFO 先进先出,只能队尾入队、队首出队,不能操作中间元素。
2. 普通队列 head 代表队首下标,tail 指向队尾后一位;入队动 tail,出队动 head。
3. 普通队列会产生假溢出,这正是循环队列要解决的问题。
4. 做循环队列题目,第一步必须看清题干 head、tail 的定义,切勿死套公式。
5. 主流定义:tail 指向队尾后一位,预留一个空位区分队列空和满。
6. 循环队列入队:先存数据,再把 tail 对总容量取模后更新。
7. 循环队列出队:先读取 head 位置元素,再更新 head,同样要做取模运算。
考点三 栈的访问与基本操作
知●识●解●构
知识点1 栈的结构特点:后进先出 LIFO
1.基本概念:是一种“先进后出”的线性表,仅允许在表的一端进行插入或删除。进行插入或删除操作的一端称为栈顶,位于栈顶位置的元素称为栈顶元素;相应地,将表的另一端称为栈底,位于栈底位置的元素为栈底元素。
2.特性
(1)先进后出、后进先出
(2)有限序列性
①栈元素个数有限。
②栈可以是空的,也可以包含多个元素。
③栈中所有元素呈现线性特征,栈顶元素有一个前驱点,栈底元素有一个后继点,其他元素既有一个前驱点,又有一个后继点。
知识点2 入栈、出栈、取栈顶元素操作
①创建(以数组结构实现):
【例】有4个字母“A”“B”“C”“D”按序入栈,可创建长度为4的栈
top=-1
st = [""]*4
②入栈、出栈
入栈
出栈
s=input('请输入一个字符串:')
for i in s:
top+=1
st[top]=i
print(st)
while top!=-1:
print(st[top],end='')
top=top-1
运行结果:
运行结果:
③数组和列表实现的栈的基本操作
4.栈的应用实例
例1.进制转换
程序
st = [-1]*100 #表中元素初始值-1
top = -1
number = int(input("请输入十进制整数:"))
while number > 0:
x=number % 2
top = top+1
st[top] = x # 入栈
number=number//2
while top >= 0:
print(st[top],end="") # 出栈
top=top-1
运行结果:
例2.括号匹配
程序
st = [""]*100
top=-1
flag=True # 标记是否有不匹配的情况
s = input("请输入数学计算式:")
for i in range(len(s)):
if s[i]=="(":
top = top+1
st[top] = s[i]
elif s[i] == ")":
if top == -1:
flag = False
break
else:
top = top-1
if top >= 0: # 中还有左括号
flag = False
if flag:
print("括号匹配")
else:
print("括号不匹配")
运行结果:
例3.逆波兰表达式
在数学常规表达式里,运算符写在两个运算对象(本题均为一位正整数)的中间;求值时,需要处理括号并遵守运算符优先级。
为方便程序计算,波兰逻辑学家 J.Lukasiewicz 提出了一种新表达式写法:运算符放在运算对象的后面。该形式不需要括号,也不用额外考虑运算符优先级,称为后缀表达式,也叫逆波兰表达式。
举例:后缀表达式6 8 2 - 2 * 3 ÷ +,对应中缀表达式 (6+(8-2)*2\3)。
st=[0]*100
top=-1
s=input('请输入逆波兰表达式:')
i=0
while i<len(s):
if '0'<=s[i]<='9':
top+=1
st[top]=int(s[i])
else:
x=st[top];top-=1
y=st[top];top-=1
if s[i]=='+':
top+=1;st[top]=x+y
elif s[i] == '-':
top+=1;st[top]=y-x
elif s[i]=='*':
top+=1;st[top]=x*y
else:
top+=1;st[top]=int(y/x)
i=i+1
print(st[top])
利用栈求逆波兰表达式的方法是:
从左往右扫描该表达式,遇到操作数时入栈;遇到运算符时,把处于栈上方的两个元素依次出栈,用运算符计算,并把计算结果压入栈中。如此反复操作,直至表达式扫描结束。
5.用列表自带的函数和方法实现的栈
stacklist=[]
建立一个空栈list
stacklist.append("A")
建一个长度为10的队列q
stacklist.append("B")
字母“A”入队
print(stacklist[1])
字母“B”入队
print(len(stacklist))
输出队列中元素的个数,个数为2
stacklist.pop()
队首元素出队,出队元素为“A”
print(len(stacklist))
输出队列中元素的个数,个数为1
考●向●破●译
考向1 给定入栈序列,判断合法出栈序列
例1 【杭州高二期末】
若元素入栈的顺序为 “琴”“棋”“书”“画”,其中 “书” 第一个出栈,则下列说法正确的是( )
A. “画” 一定在 “棋” 之后出栈
B. “琴” 一定在 “棋” 之后出栈
C. “棋” 可以最后一个出栈
D. “琴” 可以第二个出栈
答案:C
解析
入栈顺序:琴→棋→书→画;书第一个出栈。
说明:琴、棋、书已经入栈,书出栈,栈内【琴,棋】(栈底→栈顶),画还未入栈。
A:画可以先入栈然后立刻出栈,画可以在棋前面出栈;错误。
B:栈内栈顶是棋,棋一定比琴先出栈;琴一定在棋之后出栈这个是必然?注意:书出栈后栈:琴(底)、棋(顶),棋必须先弹出,琴只能棋之后。但 C 选项 “棋可以最后一个出栈” 可行:书出栈→画入栈、画出栈→棋出栈→琴出栈,最终顺序:书,画,琴,棋,棋最后出栈,C 正确。
D:琴在栈底,栈顶是棋,琴不可能第二个出栈;错误。
【变式1】【新阵地联盟联考】元素 A,B,C,D 依次入栈(入栈和出栈可穿插进行),下列出栈序列不可能实现的是()
A. A,B,C,D B. B,A,D,C C. D,C,A,B D. B,C,A,D
答案:C
解析
入栈顺序 A、B、C、D。如果 D 第一个出栈,说明 A,B,C,D 全部入栈,栈内从底到顶 A,B,C,D。D 出栈后栈顶只能是 C;C 出栈后栈顶是 B,A 不能在 B 前面出栈。序列 D,C,A,B 中 A 在 B 前面,不可能。
A:每入一个立刻出,合法。
B:AB 入栈,B 出 A 出;CD 入栈 D 出 C 出,合法。
D:AB 入,B 出;C 入 C 出;A 出;D 入 D 出,合法。
【变式2】【浙江县域教研联盟|原题】
栈初始为空,入栈序列:1,2,3,4,5。下面哪个出栈序列不可能成立()
A. 2,1,4,5,3 B. 3,2,1,5,4 C. 1,5,2,4,3 D. 2,3,5,4,1
答案:C
解析 C 选项:1 先出栈,说明 1 入栈马上出栈。后面 5 第二个出栈,则 2,3,4,5 全部入栈。栈内顺序 2,3,4,5,5 出栈后栈顶只能是 4,2 不可能紧接着 5 出栈,矛盾,序列不合法。
考向2 结合代码 / 流程图,考查栈操作过程与结果推演
例1 【金华卓越联盟高三 10 月 选择题原题】
s= "abac"
st=[]
res=""
for ch in s:
if ch not in st:
st.append(ch)
res+=ch
else:
while st[-1]!=ch:
res+=st.pop()
res+=st.pop()
print(res)
执行该程序段后,输出的结果是()
A. abac B. abba C. abca D. abcb
答案:B
解析
栈 st,append 入栈,pop () 弹出栈顶。遍历字符串 "abac"
1. ch='a':不在栈,st=[a], res="a"
2. ch='b':不在栈,st=[a,b], res="ab"
3. ch='a':a 在栈,栈顶是 b≠a,弹出 b,res="abb";此时栈顶等于 a,弹出 a,res="abba",栈空
4. ch='c':不在栈,st=[c],res 保持 abba
循环结束,输出 abba。
【变式1】【湖州 2025.01 期末 选择题原题】
data=[2,6,3,7,1]
stack=[]
ans=[]
for num in data:
while stack and stack[-1]<num:
ans.append(stack.pop())
stack.append(num)
while stack:
ans.append(stack.pop())
print(ans)
运行程序段后,列表 ans 输出为( )
A. [2,3,6,1,7] B. [2,6,3,1,7] C. [2,3,1,6,7] D. [2,3,1,7,6]
答案:C
解析 单调栈,stack 存放待处理数据,栈顶和当前 num 比较。 data=[2,6,3,7,1]
num=2,栈空,stack=[2]
num=6,栈顶 2<6,弹出 2,ans=[2];栈空,stack=[6]
num=3,栈顶 6>3,直接入栈,stack=[6,3]
num=7,栈顶 3<7,弹出 3 ans=[2,3];栈顶 6<7,弹出 6 ans=[2,3,6];栈空,stack=[7]
num=1,栈顶 7>1,直接入栈,stack=[7,1] 遍历结束,依次弹出栈剩余元素:1,7。ans 最终 [2,3,6,1,7]
真题溯源·考向感知
——溯源真题逻辑,感知高考考向
1.【2024 年 1 月浙江选考第 8 题】
栈 S 从栈底到栈顶的元素依次为 1,2,3,队列 Q 初始为空。约定:U 操作是指元素出栈后入队,H 操作是指元素出队后再入队。经过 UUHU 系列操作后,队列中队首到队尾的元素依次为()
A. 2,1,3 B. 3,1,2 C. 1,3,2 D. 2,3,1
答案:D
解析
栈后进先出,队列先进先出。
初始:栈 S 栈底→栈顶:1,2,3;队列 Q 为空。
1.U:栈顶 3 出栈入队,S=[1,2],Q=[3]
2.U:栈顶 2 出栈入队,S=[1],Q=[3,2]
3.H:队首 3 出队,重新入队,Q=[2,3]
4.U:栈顶 1 出栈入队,Q=[2,3,1]
最终队列从队首到队尾:2,3,1。
2.【2026 年 1 月浙江选考第 8 题】
队列初始为空,字符 “甲”“乙”“丙”“丁”“戊”“己” 依次入队的规则为:若队列为空,字符入队;否则队首元素出队后再入队,然后字符入队,重复执行直到字符全部入队。字符全部入队后,队首元素为()
A. 丁 B. 己 C. 甲 D. 乙
答案:D
解析
1. 加入甲:队列为空,直接入队;队列:[甲]
2. 加入乙:队列非空,队首甲出队再入队,再入乙;队列:[甲,乙]
3. 加入丙:队首甲出队再入队,再入丙;队列:[乙,甲,丙]
4. 加入丁:队首乙出队再入队,再入丁;队列:[甲,丙,乙,丁]
5. 加入戊:队首甲出队再入队,再入戊;队列:[丙,乙,丁,甲,戊]
6. 加入己:队首丙出队再入队,再入己;队列:[乙,丁,甲,戊,丙,己]
全部入队完成,队首元素为乙。
3.【2026 年 6 月浙江选考第 8 题】
栈初始为空,经过一系列入栈、出栈操作后,栈又为空。若元素入栈的顺序为 1,2,3,4,5,6,7,且每个元素入栈 1 次,最后出栈的两个元素为 5 和 2,则对于所有可行的方案,操作过程中栈内元素个数最多为()
A.3 B.4 C.5 D.6
答案:C
解析
最后出栈两个元素依次是 5、2,说明 2 和 5 是栈内留存到最后的元素,2 在栈底,5 在 2 上方。1 必须已经出栈;3、4 一定在栈内出现过。1,3,4,5,2 可同时存在栈中,共 5 个;6、7 还未入栈,因此栈内最大元素数量为 5。
4.【2024 年 1 月浙江选考第 11 题】
若字符串 s 的值为 "abcde",执行如下程序段后,变量 res 的值不可能是
from random import randint
res=""
i,j=0,len(s)-1
while i<len(s) and j>=i:
if randint(0,1) == 0: #randint(0,1)随机生成0或1
res+=s[i]
i+=1
else:
res+=s[j]
j-=1
A."abced" B."aecbd" C."aedbc" D."edcba"
答案:B
解析
指针 i 指向左端,j 指向右端;每次只能取最左s[i]或者最右s[j],只能向中间收缩,不能直接取中间字符。
B 选项aecbd,取完 a、e 之后下一个字符是 c,c 是中间字符,i=1、j=3,此时两端字符为 b 和 d,无法直接拿到 c,不可能出现。A、C、D 均可以通过随机 0/1 组合得到。
5.【2026 年 1 月浙江选考第 10 题】
c,i="",0
while i<len(s)and t>=0:
if s[i]=="e":
t-=1
else:
c+=s[i]
i+=1
若 s 为 "keeper",t 为 2,执行该程序段后,c 的值为()
A."k" B."kp" C."kpr" D."kper"
答案:C
解析
s="k e e p e r",索引 0~5;初始c="",i=0,t=2
1.i=0,s [0]='k',不是 'e',c="k";i=1
2.i=1,s [1]='e',t=1;i=2
3.i=2,s [2]='e',t=0;i=3
4.i=3,s [3]='p',不是 'e',c="kp";i=4
5.i=4,s [4]='e',t=-1;i=5
循环条件t>=0不成立,循环终止。
> 注意:i=5 不再执行循环体,字符 r 会被处理吗?i 自增到 5 的时候,是本次循环结束之后。回顾流程:i=4 处理完,i+=1 →i=5;判断i<6 and t>=-1,此时 t=-1,条件 False 直接退出。i=5(字符 r)没有执行循环体。
> 修正模拟:上面是错误!重新模拟:
> s="k","e","e","p","e","r",t=2
> i=0: s [0]='k' →c='k',i=1
> i=1: s [1]='e' →t=1,i=2
> i=2: s [2]='e' →t=0,i=3
> i=3: s [3]='p' →c='kp',i=4
> i=4: s [4]='e' →t=-1,i=5
> 判断 while 条件i<6 and t>=0 → t=-1,条件不满足,直接退出。i=5 不进入循环。c 结果是"kp"。
> 官方答案 B。
6.【2026 年 6 月浙江选考第 10 题】
i=len(s)-1
while i>= 0 and c=="*":
if "0"<=s[i]<="9":
c=s[i]
else:
i=i-1
若 c 和 s 的初始值分别为 "*"和"172D6AF",执行该程序段后,c 的值为()
A."*" B."1" C."2" D."6"
答案:D
解析
s="172D6AF",下标 0:'1',1:'7',2:'2',3:'D',4:'6',5:'A',6:'F';i=6,c="*"
从末尾向前遍历,只要 c 还等于 "*" 就继续循环;遇到数字,就把 c 赋值为此数字,循环结束。
i=6:'F' 非数字,i=5
i=5:'A' 非数字,i=4
i=4:'6' 是数字,c="6";
下一轮判断while i>=0 and c=="*",c 已经不等于 "*",循环直接退出。c 结果为"6"。
2 / 3
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$