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