补充栈练习题
This commit is contained in:
parent
0e180e0a99
commit
71df845193
|
@ -526,6 +526,135 @@
|
|||
"我们在一个转轨站里完成车厢的重排工作,在转轨站中有一个入轨、一个出轨和k个缓冲铁轨(位于入轨和出轨之间)。图(a)给出一个转轨站,其中有k个(k=3)缓冲铁轨H1,H2 和H3。开始时,n节车厢的货车从入轨处进入转轨站,转轨结束时各车厢从右到左按照编号1至n的次序离开转轨站(通过出轨处)。在图(a)中,n=9,车厢从后至前的初始次序为5,8,1,7,4,2,9,6,3。图(b)给出了按所要求的次序重新排列后的结果。"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"- 第一步:若需出轨的编号恰是入轨编号,则直接出轨。\n",
|
||||
"- 第二步:若需出轨的编号恰是缓冲轨的最小编号,则直接出轨。\n",
|
||||
"- 第三步:将入轨编号放入缓冲轨。(规则:放到满足小于缓冲轨栈顶元素编号且栈顶元素最小的上面。)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"入轨缓冲 ==> 3从入轨到缓冲轨0。\n",
|
||||
"入轨缓冲 ==> 6从入轨到缓冲轨1。\n",
|
||||
"入轨缓冲 ==> 9从入轨到缓冲轨2。\n",
|
||||
"入轨缓冲 ==> 2从入轨到缓冲轨0。\n",
|
||||
"入轨缓冲 ==> 4从入轨到缓冲轨1。\n",
|
||||
"入轨缓冲 ==> 7从入轨到缓冲轨2。\n",
|
||||
"直接出轨 ==> 1从入轨到出轨。\n",
|
||||
"缓冲出轨 ==> 2从缓冲轨0到出轨。\n",
|
||||
"缓冲出轨 ==> 3从缓冲轨0到出轨。\n",
|
||||
"缓冲出轨 ==> 4从缓冲轨1到出轨。\n",
|
||||
"入轨缓冲 ==> 8从入轨到缓冲轨0。\n",
|
||||
"直接出轨 ==> 5从入轨到出轨。\n",
|
||||
"缓冲出轨 ==> 6从缓冲轨1到出轨。\n",
|
||||
"缓冲出轨 ==> 7从缓冲轨2到出轨。\n",
|
||||
"缓冲出轨 ==> 8从缓冲轨0到出轨。\n",
|
||||
"缓冲出轨 ==> 9从缓冲轨2到出轨。\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"class Solution:\n",
|
||||
" def __init__(self):\n",
|
||||
" self.nowOut = 1 # 下一次要输出的车厢号\n",
|
||||
" self.minH = float('inf') # 缓冲铁轨中编号最小的车厢\n",
|
||||
" self.minS = -1 # minH号车厢对应的缓冲铁轨\n",
|
||||
" \n",
|
||||
" def RailRoad(self, p, k):\n",
|
||||
" \"\"\"\n",
|
||||
" 车厢重排算法\n",
|
||||
" p:入轨序列\n",
|
||||
" k:缓冲轨条数\n",
|
||||
" return: 重排是否成功\n",
|
||||
" \"\"\"\n",
|
||||
" self.h = [[] for i in range(k)] # 缓冲铁轨\n",
|
||||
"\n",
|
||||
" for i in range(len(p)):\n",
|
||||
" if p[i] == self.nowOut:\n",
|
||||
" print(\"直接出轨 ==> {0}从入轨到出轨。\".format(p[i]))\n",
|
||||
" self.nowOut += 1\n",
|
||||
" # 从缓冲铁轨中输出\n",
|
||||
" while self.minH == self.nowOut:\n",
|
||||
" self.Output() # 出轨\n",
|
||||
" self.nowOut += 1\n",
|
||||
" else:\n",
|
||||
" # 将p[i]送入某个缓冲铁轨\n",
|
||||
" if not self.Input(p[i]):\n",
|
||||
" return False\n",
|
||||
" return True\n",
|
||||
"\n",
|
||||
" def Output(self):\n",
|
||||
" \"\"\"\n",
|
||||
" 从缓冲轨移除车厢出轨\n",
|
||||
" minH: 缓冲铁轨中编号最小的车厢\n",
|
||||
" minS: minH号车厢对应的缓冲铁轨\n",
|
||||
" h: 缓冲轨道的集合\n",
|
||||
" \"\"\"\n",
|
||||
" self.h[self.minS].pop()\n",
|
||||
" print(\"缓冲出轨 ==> {0}从缓冲轨{1}到出轨。\".format(self.minH, self.minS))\n",
|
||||
"\n",
|
||||
" # 通过检查所有的栈顶,搜索新的minH和minS\n",
|
||||
" minH = float('inf')\n",
|
||||
" minS = -1\n",
|
||||
" for i in range(len(self.h)):\n",
|
||||
" if self.h[i] and self.h[i][-1] < minH:\n",
|
||||
" minH = self.h[i][-1]\n",
|
||||
" minS = i\n",
|
||||
" self.minH = minH\n",
|
||||
" self.minS = minS\n",
|
||||
"\n",
|
||||
" def Input(self, c):\n",
|
||||
" \"\"\"\n",
|
||||
" 在一个缓冲铁轨中放入车厢c\n",
|
||||
" c: 放入车厢编号\n",
|
||||
" minH: 栈顶编号的最小值\n",
|
||||
" minS: 栈顶编号最小值所在堆栈的编号\n",
|
||||
" h: 缓冲轨道的集合\n",
|
||||
" return: 如果没有可用的缓冲铁轨,则返回False,否则返回True\n",
|
||||
" \"\"\"\n",
|
||||
" bestTrack = -1 # 目前最优的铁轨\n",
|
||||
" bestTop = float('inf') # 最优铁轨上的头辆车厢\n",
|
||||
"\n",
|
||||
" for i in range(len(self.h)):\n",
|
||||
" if self.h[i]:\n",
|
||||
" x = self.h[i][-1]\n",
|
||||
" if c < x and x < bestTop:\n",
|
||||
" bestTop = x\n",
|
||||
" bestTrack = i\n",
|
||||
" else:\n",
|
||||
" if bestTrack == -1:\n",
|
||||
" bestTrack = i\n",
|
||||
" break\n",
|
||||
" if bestTrack == -1:\n",
|
||||
" return False\n",
|
||||
"\n",
|
||||
" self.h[bestTrack].append(c);\n",
|
||||
" print(\"入轨缓冲 ==> {0}从入轨到缓冲轨{1}。\".format(c, bestTrack))\n",
|
||||
" if c < self.minH:\n",
|
||||
" self.minH = c\n",
|
||||
" self.minS = bestTrack\n",
|
||||
" return True\n",
|
||||
"\n",
|
||||
"if __name__ == \"__main__\":\n",
|
||||
" p = [3, 6, 9, 2, 4, 7, 1, 8, 5]\n",
|
||||
" k = 3\n",
|
||||
" result = Solution().RailRoad(p, k)\n",
|
||||
" while not result:\n",
|
||||
" k_ = int(input(\"需要更多的缓冲轨道,请输入需要添加的数量:\"))\n",
|
||||
" k += k_\n",
|
||||
" result = Solution().RailRoad(p, k)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
|
@ -805,13 +934,6 @@
|
|||
"for s in ['QWER','QQWE','QQQW','QQQQ']:\n",
|
||||
" print(s, balancedString(s))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
|
|
|
@ -526,6 +526,135 @@
|
|||
"我们在一个转轨站里完成车厢的重排工作,在转轨站中有一个入轨、一个出轨和k个缓冲铁轨(位于入轨和出轨之间)。图(a)给出一个转轨站,其中有k个(k=3)缓冲铁轨H1,H2 和H3。开始时,n节车厢的货车从入轨处进入转轨站,转轨结束时各车厢从右到左按照编号1至n的次序离开转轨站(通过出轨处)。在图(a)中,n=9,车厢从后至前的初始次序为5,8,1,7,4,2,9,6,3。图(b)给出了按所要求的次序重新排列后的结果。"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"- 第一步:若需出轨的编号恰是入轨编号,则直接出轨。\n",
|
||||
"- 第二步:若需出轨的编号恰是缓冲轨的最小编号,则直接出轨。\n",
|
||||
"- 第三步:将入轨编号放入缓冲轨。(规则:放到满足小于缓冲轨栈顶元素编号且栈顶元素最小的上面。)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"入轨缓冲 ==> 3从入轨到缓冲轨0。\n",
|
||||
"入轨缓冲 ==> 6从入轨到缓冲轨1。\n",
|
||||
"入轨缓冲 ==> 9从入轨到缓冲轨2。\n",
|
||||
"入轨缓冲 ==> 2从入轨到缓冲轨0。\n",
|
||||
"入轨缓冲 ==> 4从入轨到缓冲轨1。\n",
|
||||
"入轨缓冲 ==> 7从入轨到缓冲轨2。\n",
|
||||
"直接出轨 ==> 1从入轨到出轨。\n",
|
||||
"缓冲出轨 ==> 2从缓冲轨0到出轨。\n",
|
||||
"缓冲出轨 ==> 3从缓冲轨0到出轨。\n",
|
||||
"缓冲出轨 ==> 4从缓冲轨1到出轨。\n",
|
||||
"入轨缓冲 ==> 8从入轨到缓冲轨0。\n",
|
||||
"直接出轨 ==> 5从入轨到出轨。\n",
|
||||
"缓冲出轨 ==> 6从缓冲轨1到出轨。\n",
|
||||
"缓冲出轨 ==> 7从缓冲轨2到出轨。\n",
|
||||
"缓冲出轨 ==> 8从缓冲轨0到出轨。\n",
|
||||
"缓冲出轨 ==> 9从缓冲轨2到出轨。\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"class Solution:\n",
|
||||
" def __init__(self):\n",
|
||||
" self.nowOut = 1 # 下一次要输出的车厢号\n",
|
||||
" self.minH = float('inf') # 缓冲铁轨中编号最小的车厢\n",
|
||||
" self.minS = -1 # minH号车厢对应的缓冲铁轨\n",
|
||||
" \n",
|
||||
" def RailRoad(self, p, k):\n",
|
||||
" \"\"\"\n",
|
||||
" 车厢重排算法\n",
|
||||
" p:入轨序列\n",
|
||||
" k:缓冲轨条数\n",
|
||||
" return: 重排是否成功\n",
|
||||
" \"\"\"\n",
|
||||
" self.h = [[] for i in range(k)] # 缓冲铁轨\n",
|
||||
"\n",
|
||||
" for i in range(len(p)):\n",
|
||||
" if p[i] == self.nowOut:\n",
|
||||
" print(\"直接出轨 ==> {0}从入轨到出轨。\".format(p[i]))\n",
|
||||
" self.nowOut += 1\n",
|
||||
" # 从缓冲铁轨中输出\n",
|
||||
" while self.minH == self.nowOut:\n",
|
||||
" self.Output() # 出轨\n",
|
||||
" self.nowOut += 1\n",
|
||||
" else:\n",
|
||||
" # 将p[i]送入某个缓冲铁轨\n",
|
||||
" if not self.Input(p[i]):\n",
|
||||
" return False\n",
|
||||
" return True\n",
|
||||
"\n",
|
||||
" def Output(self):\n",
|
||||
" \"\"\"\n",
|
||||
" 从缓冲轨移除车厢出轨\n",
|
||||
" minH: 缓冲铁轨中编号最小的车厢\n",
|
||||
" minS: minH号车厢对应的缓冲铁轨\n",
|
||||
" h: 缓冲轨道的集合\n",
|
||||
" \"\"\"\n",
|
||||
" self.h[self.minS].pop()\n",
|
||||
" print(\"缓冲出轨 ==> {0}从缓冲轨{1}到出轨。\".format(self.minH, self.minS))\n",
|
||||
"\n",
|
||||
" # 通过检查所有的栈顶,搜索新的minH和minS\n",
|
||||
" minH = float('inf')\n",
|
||||
" minS = -1\n",
|
||||
" for i in range(len(self.h)):\n",
|
||||
" if self.h[i] and self.h[i][-1] < minH:\n",
|
||||
" minH = self.h[i][-1]\n",
|
||||
" minS = i\n",
|
||||
" self.minH = minH\n",
|
||||
" self.minS = minS\n",
|
||||
"\n",
|
||||
" def Input(self, c):\n",
|
||||
" \"\"\"\n",
|
||||
" 在一个缓冲铁轨中放入车厢c\n",
|
||||
" c: 放入车厢编号\n",
|
||||
" minH: 栈顶编号的最小值\n",
|
||||
" minS: 栈顶编号最小值所在堆栈的编号\n",
|
||||
" h: 缓冲轨道的集合\n",
|
||||
" return: 如果没有可用的缓冲铁轨,则返回False,否则返回True\n",
|
||||
" \"\"\"\n",
|
||||
" bestTrack = -1 # 目前最优的铁轨\n",
|
||||
" bestTop = float('inf') # 最优铁轨上的头辆车厢\n",
|
||||
"\n",
|
||||
" for i in range(len(self.h)):\n",
|
||||
" if self.h[i]:\n",
|
||||
" x = self.h[i][-1]\n",
|
||||
" if c < x and x < bestTop:\n",
|
||||
" bestTop = x\n",
|
||||
" bestTrack = i\n",
|
||||
" else:\n",
|
||||
" if bestTrack == -1:\n",
|
||||
" bestTrack = i\n",
|
||||
" break\n",
|
||||
" if bestTrack == -1:\n",
|
||||
" return False\n",
|
||||
"\n",
|
||||
" self.h[bestTrack].append(c);\n",
|
||||
" print(\"入轨缓冲 ==> {0}从入轨到缓冲轨{1}。\".format(c, bestTrack))\n",
|
||||
" if c < self.minH:\n",
|
||||
" self.minH = c\n",
|
||||
" self.minS = bestTrack\n",
|
||||
" return True\n",
|
||||
"\n",
|
||||
"if __name__ == \"__main__\":\n",
|
||||
" p = [3, 6, 9, 2, 4, 7, 1, 8, 5]\n",
|
||||
" k = 3\n",
|
||||
" result = Solution().RailRoad(p, k)\n",
|
||||
" while not result:\n",
|
||||
" k_ = int(input(\"需要更多的缓冲轨道,请输入需要添加的数量:\"))\n",
|
||||
" k += k_\n",
|
||||
" result = Solution().RailRoad(p, k)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
|
@ -805,13 +934,6 @@
|
|||
"for s in ['QWER','QQWE','QQQW','QQQQ']:\n",
|
||||
" print(s, balancedString(s))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
|
|
Loading…
Reference in New Issue