栈的应用_进制转换
題目要求:
把int型的數(shù)據(jù)N轉(zhuǎn)化為b進(jìn)制數(shù)(2 ≤\leq≤ b≤\leq≤ 16),同時注意以字符串的形式存儲,不能以數(shù)字的形式存儲。
比如十六進(jìn)制的10,就要輸出為A。
解析:
此題是將十進(jìn)制數(shù)N轉(zhuǎn)換為其他b進(jìn)制。轉(zhuǎn)換規(guī)則是:N除以進(jìn)制數(shù)b取余數(shù),然后余數(shù)倒序排列。請注意,這里的倒序輸出正好滿足棧的特性:后進(jìn)先出,也就是出棧的順序就是倒序排列。
利用棧stack的后進(jìn)先出特性進(jìn)行進(jìn)制轉(zhuǎn)換
convector_with_stack()函數(shù):兩個參數(shù):待轉(zhuǎn)換數(shù)據(jù)N,進(jìn)制b
幾點(diǎn)說明:
【1】這里得到余數(shù)的部分使用do-while循環(huán),而不是直接使用while循環(huán)的目的是:如果使用while(N!=0) {},會使得N=0無法被考慮。而使用do-while循環(huán)至少運(yùn)行一次,N=0的情況也被包含其中。
do{S.push(d2c[N%b]);//余數(shù)N /= b;//商} while (N!=0);【2】提前定義字符串d2c,結(jié)合余數(shù)直接可以得到b進(jìn)制的表示形式
d2c[N%b],然后壓入S。經(jīng)過上面的do-while循環(huán),這時候S中存儲的是余數(shù)的正序。我們需要的是逆序的余數(shù)。
【3】棧(stack)的出棧操作pop()正好滿足。棧頂元素top()拿出來之后出棧,得到下一個棧頂元素,一直到棧為空。
while (!S.empty())//如果S非空{result += S.top();//后進(jìn)先出S.pop();}全部可運(yùn)行代碼如下:
#include "pch.h" #include <iostream> #include<stack> #include<queue> #include<string>using namespace std; //利用棧,進(jìn)制轉(zhuǎn)換 void convector_with_stack(int N,size_t b) {string d2c = "0123456789ABCDEF";//數(shù)字字母下標(biāo)映射string result;if (N < 0)//對負(fù)數(shù)的處理{result +="-";N = -N;}stack<char> S;do{S.push(d2c[N%b]);//余數(shù)N /= b;//商} while (N!=0); while (!S.empty()){result += S.top();//后進(jìn)先出S.pop();}cout<<result << endl; }int main() {string R = "";//空的字符串cout << "請輸入要轉(zhuǎn)換的數(shù)據(jù):";int N;cin >>N;size_t b;cout << "請輸入要轉(zhuǎn)換的數(shù)制:";cin >> b;if (b >= 2 && b <= 16){convector_with_stack(N,b);}elsecout << "進(jìn)制輸入有誤" << endl;return 0; }總結(jié):
這道題我們需要學(xué)習(xí)的是:棧非空時,連續(xù)彈出這個技巧。
希望對你有幫助。
總結(jié)
- 上一篇: 数据结构_栈和队列的区别
- 下一篇: HDU4143-A Simple Que