补充栈练习题

This commit is contained in:
Jnewgeek 2021-04-01 23:16:08 +08:00
parent 0e180e0a99
commit 71df845193
2 changed files with 258 additions and 14 deletions

View File

@ -526,6 +526,135 @@
"我们在一个转轨站里完成车厢的重排工作在转轨站中有一个入轨、一个出轨和k个缓冲铁轨位于入轨和出轨之间。图a给出一个转轨站其中有k个k=3缓冲铁轨H1H2 和H3。开始时n节车厢的货车从入轨处进入转轨站转轨结束时各车厢从右到左按照编号1至n的次序离开转轨站通过出轨处。在图an=9车厢从后至前的初始次序为581742963。图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": {

View File

@ -526,6 +526,135 @@
"我们在一个转轨站里完成车厢的重排工作在转轨站中有一个入轨、一个出轨和k个缓冲铁轨位于入轨和出轨之间。图a给出一个转轨站其中有k个k=3缓冲铁轨H1H2 和H3。开始时n节车厢的货车从入轨处进入转轨站转轨结束时各车厢从右到左按照编号1至n的次序离开转轨站通过出轨处。在图an=9车厢从后至前的初始次序为581742963。图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": {