acm基礎3

1、爲什麼說類是一種關於對象的封裝?
將變量放在保護區,外部調用者無法隨意改變它的值,也就是提高了封裝性。

2、結構與類有哪些相同點和不同點?
相同點:都是通過new來實例化。
不同點:
1)類是引用類型,存儲在堆中,結構是值類型,存儲在棧中。
2)類要比結構功能強,性質多:類支持繼承,結構不支持繼承,只記錄了物體的一些性質。
3)類通過class聲明,結構通過struct聲明。
4)結構不能定義無參數的構造方法。
5)默認的成員訪問權限不同:struct中的變量被默認爲public的,而class中默認爲private的。

3、全局變量、局部變量、靜態變量和動態變量的異同?
1)全局變量就是對全局起作用,局部變量只對某一程序段起作用,他們主要是作用範圍不同。
2)靜態變量與動態變量的生命週期不同,靜態變量在程序運行期間一直存在於存儲空間內,執行過程中不自動釋放,並且僅在應用程序啓動運行前被初始化一次;動態變量在執行時根據需要臨時分配空間,再次調用不會記錄上次執行結果。另外,本質的不同是動態變量保存在棧中,靜態變量保存在程序的數據段中。

4、什麼情況下運算符重載不用定義爲友元函數?
1)運算符的第一個參數不是要操作的類自己(例如重定向運算符<<,左操作數是一個stream類)。
2)該重載必須訪問私有或保護數據。

5、數據結構-常見的存儲結構包括:
順序(數組)、鏈式(線性表-地址連續)、索引和散列。

【注1】淺拷貝與深拷貝參考:
http://blog.csdn.net/feitianxuxue/article/details/9275979
淺拷貝只是對指針的拷貝,拷貝後兩個指針指向同一個內存空間,深拷貝不但對指針進行拷貝,而且對指針指向的內容進行拷貝,經深拷貝後的指針是指向兩個不同地址的指針。

【注2】線性表特例(操作受限):棧;循環隊列
<1>棧:運算只在表的一端進行,也稱爲“下推表”;棧頂元素是唯一可訪問的元素,元素的插入稱爲“入棧”,元素的刪除稱爲“出棧”。
順序棧使用向量實現,本質是順序表的簡化,關鍵是確定哪一端作爲棧頂;鏈式棧用單鏈表方式存儲,其中指針的方向是從棧頂向下鏈接。
順序棧和鏈式棧比較:時間效率上,所有操作都只需常數時間,順序棧和鏈式棧在時間效率上難分伯仲;空間效率上順序棧須說明一個固定的長度,鏈式棧的長度可變,但增加結構性開銷;實際應用中,順序棧比鏈式棧用的更廣泛,因爲順序棧容易根據棧頂位置,進行相對位移,速度定位並讀取棧的內部元素,而順序棧讀取內部元素的時間爲O(1),而鏈式棧則需要沿着指針鏈遊走,雖然慢,讀取第k個元素需要時間爲O(k)。

<2>隊列:運算只在表的兩段進行,先進先出,按照到達的順序來釋放元素,所有的插入在表的一端進行,所有的刪除操作在表的另一端進行。主要元素是隊頭和隊尾。

6、數據結構-邏輯結構包括線性和非線性兩類:
線性結構包括:散列表、堆棧、隊列。
非線性結構包括:樹、圖。

7、二維數組在內存中是如何排列的?
當二維數組存儲字符串時,3個字母的字符串必須留出4個位置,因爲字符串必須以‘\0’結尾。對於二維數組來說,第2維是比較重要的,第2維代表着這個字符串換的長度,這個長度確定下來以後,其物理排列方式就定下來了,所以2維數組也可以寫成char monthName[] [4]={“Jan”,“Feb”};

8、一維數組名可以當指針使用,二維數組名能用做雙指針來使用嗎?
可以,如果把數組名當作參數傳遞給函數,那麼編譯器將認爲傳遞的是指針,不管它是多少維數組。比如:

int iArray[10];
void f1(int *p1);
如果這樣調用f1(iArray),那麼p1[0]等於iArray[0]……
int iArray[10][10];
void f2(int *p2);
如果這樣調用f2((int *)iArray),那麼p2[0]等於iArray[0][0]……

9、鏈表與數組相比有哪些優缺點?
(1)鏈表的插入刪除方便,並且可以動態刪除,數組的插入刪除需要移動大量元素。
(2)鏈表可以動態應用內存,數組的大小是預先定義的,定義過大會浪費空間,過小會導致內存溢出。
(3)數組採用順序存儲方式,佔用連續內存;而鏈表每個節點沒有相對固定的位置關係。

10、遞歸函數的調用過程實際上就是棧的一個應用,用基於棧的算法來描述遞歸算法的實現過程。舉例:
int fun(int a)
{
if(a==1) return 1;
else
{
a=a*fun(a-1);
return a;
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章