複習資料結構,寫一些簡單的題目複習一下。
stack
#include #include using namespace std;
int countmatch(string s) }}
return n;
}int main()
/*輸出:
5*/
#include#includeusing namespace std;
int match(string longstr,string shortstr)
if(li == longstr.end() || *si != *li)
goto skip;
}skip:
li = ++ti;
continue;
goon:
continue;
}return count;
} int main()
題目:a=10,b=15,將a / b的值互換。
通常我們的做法是(尤其是在學習階段):定義乙個新的變數,借助它完成交換。**如下:
int a,b;
a=10; b=15;
int t;
t=a; a=b; b=t;
這種演算法易於理解,特別適合幫助初學者了解電腦程式的特點,是賦值語句的經典應用。在實際軟體開發當中,此演算法簡單明瞭,不會產生歧義,便於程式設計師之間的交流,一般情況下碰到交換變數值的問題,都應採用此演算法(以下稱為標準演算法)。
上面的演算法最大的缺點就是需要借助乙個臨時變數。那麼不借助臨時變數可以實現交換嗎?答案是肯定的!
1) 算術運算
簡單來說,就是通過普通的+和-運算來實現。**如下:
int a,b;
a=10;b=12;
a=b-a; //a=2;b=12
b=b-a; //a=2;b=10
a=b+a; //a=10;b=10
通過以上運算,a和b中的值就進行了交換。表面上看起來很簡單,但是不容易想到,尤其是在習慣標準演算法之後。
它的原理是:把a、b看做數軸上的點,圍繞兩點間的距離來進行計算。
具體過程:第一句「a=b-a」求出ab兩點的距離,並且將其儲存在a中;第二句「b=b-a」求出a到原點的距離(b到原點的距離與ab兩點距離之差),並且將其儲存在b中;第三句「a=b+a」求出b到原點的距離(a到原點距離與ab兩點距離之和),並且將其儲存在a中。完成交換。
此演算法與標準演算法相比,多了三個計算的過程,但是沒有借助臨時變數。(以下稱為算術演算法)
該演算法還可以這樣做:
int a,b;
a=10;b=12;
a=a+b=22;
b=a-b=10;
a=a-b=12;
兩個減操作乙個加操作,執行的先後順序不一樣,其原理也稍微有些區別,但根本原理是一樣滴。
3) 位運算
通過異或運算也能實現變數的交換,這也許是最為神奇的,請看以下**:
int a=10,b=12; //a=1010^b=1100;
a=a^b; //a=0110^b=1100;
b=a^b; //a=0110^b=1010;
a=a^b; //a=1100=12;b=1010;
此演算法能夠實現是由異或運算的特點決定的,通過異或運算能夠使資料中的某些位翻轉,其他位不變。這就意味著任意乙個數與任意乙個給定的值連續異或兩次,值不變。
即:a^b^b=a。將a=a^b代入b=a^b則得b=a^b^b=a;同理可以得到a=b^a^a=b;輕鬆完成交換。
以上三個演算法均實現了不借助其他變數來完成兩個變數值的交換,相比較而言算術演算法和位演算法計算量相當,位址演算法中計算較複雜,卻可以很輕鬆的實現大型別(比如自定義的類或結構)的交換,而前兩種只能進行整形資料的交換(理論上過載「^」運算子,也可以實現任意結構的交換)
4. 台階問題
假設a上台階,一次可以跨1層,2層或3層,問a上50層台階,有多少種走法?
假設a上台階,一次可以跨1層,2層,3層.. 或m層,問a上n層台階,有多少種走法?
其中,m和n都是正整數,並且 m <= n, m <= 10, n <= 50
請程式設計解決這個問題,並詳細說明解題思路。
解:典型的遞迴問題。考慮第一步,有三種可能,走一步,走兩步,走三步。立馬就有乙個遞迴式,f(n) = f(n - 1) + f(n - 2) + f(n - 3)。終結點是f(1) f(2) f(3)。這樣有很大重複,可以用乙個備忘錄記下來這些值。
#include
using namespace std;
int mem[1000] = {};
int f(int n)
int main()
資料結構複習題綱
最近把近期的部落格和生活中的一些瑣事進行了整理和歸納,從現在起,開始著手準備資料結構的複習了。同時做一些筆記與大家共同分享 進步!感謝大家的支援!記得點讚啦!第二章 鍊錶 第三章 棧和佇列 對特定問題求解步驟的一種描述,它是指令的有限序列,其中每一條指令表示乙個或多個操作 此外,乙個演算法還具有下列...
資料結構複習題(二)
一 選擇題 24分 1 下面關於線性表的敘述錯誤的是 a 線性表採用順序儲存必須占用一片連續的儲存空間 b 線性表採用鏈式儲存不必占用一片連續的儲存空間 c 線性表採用鏈式儲存便於插入和刪除操作的實現 d 線性表採用順序儲存便於插入和刪除操作的實現 2 設哈夫曼樹中的葉子結點總數為m,若用二叉鍊錶作...
資料結構複習題(五)
一 選擇題 20分 1 資料的最小單位是 a 資料項 b 資料型別 c 資料元素 d 資料變數 2 設一組初始記錄關鍵字序列為 50,40,95,20,15,70,60,45 則以增量d 4的一趟希爾排序結束後前4條記錄關鍵字為 a 40,50,20,95 b 15,40,60,20 c 15,20...