栈、队列应用题

1、名词解释:栈。

        答:栈是只准在一端进行插入和删除操作的线性表,允许插入和删除的一端叫栈顶,另一端叫栈底。最后插入的元素最先删除,故栈也称后进先出(LIFO)表。

2、名词解释:队列。

        答:队列是允许在一端插入而在另一端删除的线性表,允许插入的一端叫队尾,允许删除的一端叫队头。最先插入队的元素最先删除,故队列也常常称先进先出(FIFO)表。

3、什么是循环队列?

        答:用常规意义下顺序存储结构的一维数组表示队列,由于队列的性质(队尾插入和队头删除),容易造成“假溢出”现象,即队尾已到达一维数组的高下标,不能再插入,然而队中元素个数小于队列的长度(容量)。循环队列是解决“假溢出”的一种办法。通常把一位数组看成首尾相接。在循环队列下,通常采用“牺牲一个存储单元”或“做标记”的办法解决“队满”和“队空”的判定问题。

4、假设以s和x分别表示入栈和出栈操作,则对初态和终态均为空的栈操作可由s和x组成的序列表示(如SXSX)。

        ①试指出判别给定序列是否合法的一般规则。

        答:通常有两条规则。第一是给定序列中S的个数和X的个数相等;第二是从给定序列的开始,到给定序列中的任一位置,S的个数要大于或等于x的个数。

        ②两个不同合法序列(对同一输入序列)能否得到相同的输出元素序列?如能得到,请举例说明。

        此题对“同一输入序列”有两种理解,因此有两种答案。

        理解一:输入序列的元素相同,但元素之间的顺序可以不同

        答一:可以得到相同的输出元素序列。例如,输入元素为A,B,C,则两个输入的合法序列ABC和BAC均可得到输出元素序列ABC。对于合法序列ABC,我们使用本题约定的SXSXSX操作序列;对于BAC,我们使用SSXXSX操作序列。

        理解二:输入序列的元素相同且元素之间的顺序也相同

答案二:如下图所示

 

### 队列的经典面试题解析 #### 1. 括号匹配问题 括号匹配问题是的一个典型应用案例。给定一个字符串,其中包含多种类型的括号(如圆括号`()`、方括号`[]`以及大括号`{}`),判断该字符串中的括号是否合法配对。可以通过维护一个来解决此问题,每当遇到左括号时将其压入中;当遇到右括号时,则弹出顶元素并与之比较,如果两者不匹配则返回错误[^1]。 ```python def is_valid_parentheses(s: str) -> bool: stack = [] mapping = {")": "(", "}": "{", "]": "["} for char in s: if char in mapping.values(): stack.append(char) elif char in mapping.keys(): top_element = stack.pop() if stack else '#' if mapping[char] != top_element: return False else: continue return not stack ``` #### 2. 使用队列实现 利用两个队列可以模拟的行为。具体来说,每次执行“push”操作时都将新元素加入到其中一个队列的末尾,并将另一个队列中的所有元素依次转移到当前队列中,从而使得最新插入的元素始终位于队首位置以便于后续的“pop”操作[^2]。 ```python class MyStack: def __init__(self): self.queue1 = collections.deque() self.queue2 = collections.deque() def push(self, x: int) -> None: self.queue2.append(x) while self.queue1: self.queue2.append(self.queue1.popleft()) self.queue1, self.queue2 = self.queue2, self.queue1 def pop(self) -> int: return self.queue1.popleft() def top(self) -> int: return self.queue1[0] def empty(self) -> bool: return not self.queue1 ``` #### 3. 利用实现队列 同样也可以借助两个完成队列的功能。对于每一次“enqueue”请求,只需简单地把数据推送到第一个即可。“dequeue”的时候稍微复杂一点——先检查第二个是否有剩余项目存在,如果有就直接从中取出最上面的那个作为结果;如果没有的话就把整个第一个的内容倒腾过来再做同样的事情。 ```python class MyQueue: def __init__(self): self.stack_in = [] self.stack_out = [] def push(self, x: int) -> None: self.stack_in.append(x) def _move_elements(self): if not self.stack_out: while self.stack_in: self.stack_out.append(self.stack_in.pop()) def pop(self) -> int: self._move_elements() return self.stack_out.pop() def peek(self) -> int: self._move_elements() return self.stack_out[-1] def empty(self) -> bool: return not (self.stack_in or self.stack_out) ``` #### 4. 循环队列的设计 设计循环队列时需要注意区分空状态与满状态之间的关系。由于头指针(`front`)尾指针(`tail`)相等既可以表示队列为零长度的状态也可能意味着它已经填满了所有的可用空间,因此通常会牺牲掉一个存储单元用于标记这种边界情况[^3]。 ```python class CircularQueue: def __init__(self, k: int): self.size = k + 1 self.data = [None]*self.size self.front = 0 self.rear = 0 def enQueue(self, value: int) -> bool: if self.isFull(): return False self.data[self.rear] = value self.rear = (self.rear + 1)%self.size return True def deQueue(self) -> bool: if self.isEmpty(): return False self.front = (self.front + 1)%self.size return True def Front(self) -> int: if self.isEmpty(): return -1 return self.data[self.front] def Rear(self) -> int: if self.isEmpty(): return -1 return self.data[(self.rear-1+self.size)%self.size] def isEmpty(self) -> bool: return self.front == self.rear def isFull(self) -> bool: return (self.rear+1)%self.size == self.front ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值