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