栈的应用练习题
### 栈的应用知识点详解 #### 一、括号匹配检验 **知识点概述:** 括号匹配检验是一个典型的栈应用问题。其主要目的是检测一个含有多种类型括号(圆括号`()`, 方括号`[]`, 花括号`{}`)的字符串中的括号是否正确配对。这个问题可以通过使用栈数据结构来高效解决。 **核心概念:** - **栈**:一种后进先出(LIFO)的数据结构。 - **括号匹配**:确保每个左括号都能找到与之相对应的右括号,并且配对正确。 **具体步骤:** 1. **初始化栈**:创建一个空栈用于存储左括号。 2. **遍历字符串**:从左到右逐个检查字符串中的字符。 - 如果遇到左括号,将其压入栈中。 - 如果遇到右括号,执行以下操作: - 如果栈为空,说明没有与当前右括号相匹配的左括号,直接返回不匹配。 - 如果栈顶的左括号与当前右括号类型相同,则从栈中弹出该左括号。 - 否则,返回不匹配。 3. **检查栈**:遍历结束后,如果栈为空,则说明所有括号都已正确匹配;否则,返回不匹配。 **代码实现框架**: ```python def is_matched(expression): stack = [] for char in expression: if char in "([{": stack.append(char) elif char in ")]}": if not stack: return False top = stack.pop() if (char == ")" and top != "(") or \ (char == "]" and top != "[") or \ (char == "}" and top != "{"): return False return len(stack) == 0 ``` **应用实例**: - 输入:`(a+b)[4*5+(-6)]` - 输出:`ok` - 输入:`[5*8]/{(a+b)-6}` - 输出:`error` #### 二、数制转换 **知识点概述:** 数制转换是将一个数字从一种进位制(通常为十进制)转换到另一种进位制的过程。本节主要讨论如何将十进制数转换为k进制数。 **核心概念:** - **整数部分转换**:使用除k取余的方法。 - **小数部分转换**:使用乘k取整的方法。 **具体步骤:** 1. **整数部分转换**: - 除以目标进位制k并获取余数,直到商为0为止。 - 将得到的余数逆序排列即为转换后的整数部分。 2. **小数部分转换**: - 乘以目标进位制k并获取整数部分。 - 重复此过程直到小数部分为0或达到所需的精度。 - 结果为转换后的小数部分。 **代码实现框架**: ```python def convert_to_base(n, k): int_part, dec_part = str(n).split('.') int_result = '' dec_result = '' # 整数部分转换 while int(int_part) > 0: remainder = int_part % k int_result += str(remainder) int_part //= k int_result = int_result[::-1] # 小数部分转换 dec_part = float('0.' + dec_part) while dec_part != 0 and len(dec_result) < 10: dec_part *= k digit = int(dec_part) dec_result += str(digit) dec_part -= digit return f"{int_result}.{dec_result}" ``` **应用实例**: - 输入:`19.125`, `2` - 输出:`10011.001` - 输入:`15.125`, `16` - 输出:`F.1F.2` #### 三、组队列 **知识点概述:** 组队列是一种特殊的队列结构,其中队列被划分为不同的组,同一组内的元素具有优先级。 **核心概念:** - **ENQUEUE**:向队列中添加元素,如果是同一组,则添加到该组末尾;如果不是同一组,则添加到队列末尾。 - **DEQUEUE**:移除队列头部的元素。 - **STOP**:停止队列操作。 **具体步骤:** 1. **初始化队列**:创建一个空的多组队列。 2. **处理命令**: - 对于`ENQUEUE`命令,检查队列中是否已有该组,如果有,则将元素添加到该组末尾;如果没有,则将元素添加到队列末尾。 - 对于`DEQUEUE`命令,从队列头部移除一个元素。 - 对于`STOP`命令,结束处理。 **代码实现框架**: ```python class GroupQueue: def __init__(self): self.queue = [] def enqueue(self, element, group): found = False for i, (g, q) in enumerate(self.queue): if g == group: self.queue[i][1].append(element) found = True break if not found: self.queue.append([group, [element]]) def dequeue(self): if not self.queue: return None group, elements = self.queue[0] if len(elements) > 1: return elements.pop(0) else: return self.queue.pop(0)[1].pop() def process_commands(self, commands): result = [] for cmd in commands: if cmd.startswith("ENQUEUE"): _, element = cmd.split() element = int(element) self.enqueue(element, element // 100) elif cmd == "DEQUEUE": result.append(str(self.dequeue())) elif cmd == "STOP": break return result ``` **应用实例**: - 输入: - 组队列:`2` - 第1组:`3 101 102 103` - 第2组:`3 201 202 203` - 命令:`ENQUEUE 101`, `ENQUEUE 201`, `DEQUEUE`, `ENQUEUE 102`, `ENQUEUE 202`, `ENQUEUE 103`, `ENQUEUE 203`, `DEQUEUE`, `DEQUEUE`, `STOP` - 输出:`201`, `202`, `203`, `102`, `103`