一道值得思考的資料結構題目(入棧與出棧序列)
就業指導課上做的一道資料結構中有關棧的題目,當時一開始自己思考不全面,錯選了。
一個棧的入棧序列為1,2,3,…,n ,其出棧序列是 p 1 ,p 2 ,p 3 ,…p n 。若p 2 = 3,則 p 3 可能取值的個數是()
A:n -3
B:n - 2
C:n - 1
D:無法確定
答案:C ( n - 1)個
看了別人的一些解析,覺得不夠完善,下面給出自己的見解。
首先,棧的先進後出原則大家應該是知道的。
根據題意 p 2 = 3,可以知道 p 1 的可能情況有三種:1,2 或 4 。(看到有些人只想到了 1,2)
為啥這樣想呢?這裡估計還有一個關鍵是要考慮到 n 的大小
當 n = 3 時, p 2 = 3 的話,那麼 p 1 有兩種情況 1 和 2 。
- 如果 p 1 = 1 , 那麼 p 3 = 2 ;
- 如果 p 1 = 2 ,那麼 p 3 = 1 ;
此時的話我們就可以看到 p 3 只有兩種可能 1 或者 2 (n - 1)個。
當 n > 3 時: p 2 = 3 的話,那麼 p 1 有三種情況 1 , 2 和 4 。
- 如果 p 1 = 1 , 那麼 p 3 = 2,4,5,… n (n - 2)個
- 如果 p 1 = 2 ,那麼 p 3 = 1,4,5,… n (n - 2)個
- 如果 p 1 = 4 ,那麼 p 3 = 2,5,6,… n (n - 3)個
此時的話我們就可以看到 p 3 的情況有 1,2,4,5,… n (n - 1)個。
綜上所述就是 p 3 可能取值的個數是 (n - 1)個。
相關推薦
一道值得思考的資料結構題目(入棧與出棧序列)
就業指導課上做的一道資料結構中有關棧的題目,當時一開始自己思考不全面,錯選了。 一個棧的入棧序列為1,2,3,…,n ,其出棧序列是 p 1 ,p 2 ,p 3 ,…p n 。若p 2 = 3,則 p 3 可能取值的個數是() A:n -3 B:n - 2
[資料結構]Graph之入度與出度計算
//同上一篇,這裡的圖採用的是鄰接表儲存 //做了一點修改,改成和課本上儲存相同的結構了,也就是說連結串列裡的資料存放的都是與之相鄰的點(不包含該點) template<int max_si
PTA 資料結構題目(1):最大子列和問題(分而治之、線上處理演算法)
題目來源: 問題描述: 問題分析: 對於一般的問題,原始解 都能通過一種 蠻力演算法,即窮舉法的思想得到。這題也不例外。 如果我們,把輸入的陣列,所有的子列都歷遍,並從中找出最大,即可得出我們的演算法。也就是版本一。 學習要點: 1、如何
DOO-SABIN 細分正方體(2)利用半邊資料結構表示(一次和兩次細分)
#include <windows.h> #include <math.h> #include <gl/GL.h> #include <GL/glut.h> //static const GLfloat ve
如何在兩個伺服器之間傳輸檔案或者資料夾?(埠相同與不同的情況)
1、從本機傳輸檔案到另外一個伺服器: scp -P 8122 /home/helpteach/project/mallupload/1509681299449.png [email protected]:/home/test ps:-P 8122指的是接受檔案
Tinker熱修復接入詳解(入坑並出坑篇)
注:當然一開始要參考Tinker的詳細說明,連結如下: https://github.com/Tencent/tinker/wiki 下面就是我自己一步一步操作,並完成接入Tinker,而且入坑並出坑的過程。 一:android studio自己建立個工程 二:工程的b
今天總結一下我對Fragment的理解(碎片的入棧與出棧,碎片的巢狀)
1.碎片的巢狀! getFragmentManager到的是activity對所包含fragment的Manager,而如果是fragment巢狀fragment,那麼就需要利用getChildFragmentManager()了。 getFragmentManager(
C/C++ 知識回顧 棧的入棧與出棧
#include<iostream> using namespace std; typedef struct student { int data; struct student *
資料結構(C語言)棧的建立、入棧、出棧並進行進位制轉換
十進位制數轉換為八進位制: | N |N div 8(商) | N mod 8(餘數) |1348| 168 | 4 | 168 | 21 | 0
資料結構——入棧,出棧,佇列相關操作(C語言實現)
閱讀過程之中可能會花費比較多的時間:建議直接翻到最後,有完整的程式碼可以使用 程式準備工作 #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include<proc
資料結構---佇列(C語言陣列實現)
https://blog.csdn.net/morixinguan/article/details/51374296 資料結構---佇列(C語言陣列實現) 佇列是先進先出的過程。簡單地畫一幅畫來描述一下佇列: 一個簡單的、由陣列實現的佇列,可以由以下幾種最基本的操
資料結構排序(一)
插入排序:直接插入排序,希爾排序 直接插入排序: 穩定性:不改變相同關鍵字序列,穩定 ASL: : 解釋說明: 序 號:0 1 2 3 4 5 6 7 8 監視哨: 34 12 49 28 31 52 51 49* 第一趟: 34 第二趟: 12 34 第三趟: 12 3
字串資料結構實現(連結串列方式)
相較於陣列方式的實現,C語言我採用了單鏈表的方式實現,C++採用了雙鏈表的方式。毫無疑問,雙鏈表的效率肯定是要遠高於單鏈表的。這次支援中文字元的操作,這個實現的思路是,在節點類中新增兩個成員變數,一個用來存放char字元,一個用來存放wchar_t字元。關於兩者的相互轉換及輸出請參考 C語言
最後一次資料結構上機(11.7)
第一題單鏈表 1)建立n個元素的單鏈表 void create() 2)計算連結串列中大於x的節點個數int countx(int x) 3)建立兩個連結串列,然後取交集 以下原始碼: head.h #pragma once #include<i
資料結構——圖(2)——圖的儲存和表示方式.md
圖的儲存方式 在實踐中,圖最常見的策略是: 將每個節點的連線儲存在鄰接列表中。 將整個圖形的連線儲存在鄰接矩陣中。 用鄰接連結串列來表示圖之間的關係 在圖中表示連線的最簡單方法是在每個節點的資料結構中儲存與其連線的節點的列表。該結構稱為鄰接列表。 例如
資料結構——圖(3)——深度優先搜尋演算法(DFS)思想
圖的遍歷 圖由頂點及其邊組成,圖的遍歷主要分為兩種: 遍歷所有頂點 遍歷所有邊 我們只討論第一種情況,即不重複的列出所有的頂點,主要有兩種策略:深度優先搜尋(DFS),廣度優先搜尋(BFS) 為了使深度和廣度優先搜尋的實現演算法的機制更容易理解,假設提
資料結構——圖(1)——圖的簡單介紹
圖的簡介 我們先回顧一下之前介紹的樹的概念,在樹的定義中,每個節點只能有一個父類,並且樹中不能出現有環形。但是你可曾想過,當一棵樹沒有任何規則的時候,會發生什麼嗎? 現在,我們給圖(graph)下一個定義: 圖,是一種用節點和邊來表示相互關係的數學模型。(A graph is a
資料結構——圖(7)——最短路徑與Dijkstra's Algorithm
帶權圖 在圖中,給每一條路徑帶上一定的權重,這樣的圖我們稱為帶權圖。如下圖所示: 我們現在來回顧一下BFS跟DFS的基本思想: 深度優先搜尋:繼續沿著路徑搜尋,直到我們需要回溯,但這種方式不保證最短路徑。 廣度優先搜尋:檢視包含距離1的鄰居,然後是距離2的鄰
資料結構——圖(6)——深入分析BFS演算法
DFS的不足和BFS演算法 雖然我們知道根據DFS演算法我們可以找到所有的,由起始節點到目標節點的所有路徑,但並不代表那條路是最短的或者是最佳的。就像我們上篇文章所說的一樣,對於同一幅圖,非遞迴演算法找到的路徑就明顯比遞迴演算法找的要短。 回顧我們之前提到的BFS的基本思想:從起始頂
資料結構——圖(5)——深入分析DFS演算法
對DFS的過程分析 在前面的文章中我們提到了這樣的一幅圖: 我們知道,在DFS中,我們採用的是遞迴的方式進行實現的,並且給每一個遍歷過的點都做上了標記,目的是為了防止程式進入死迴圈。(為什麼樹可以不需要呢?因為樹沒有環) 利用之前專欄提到的遞迴模式,我們可以寫出下面的虛擬碼: