PPC的C/C++和人工智能学习笔记
每一篇学习笔记,都只是为了更好地掌握和理解

C++语言基础(18-2)_栈的应用进制转换

栈的应用,简单的进制转换:

注意10->16进制的时候,有个比较好的方法:

“01234567890ABCDEF”[余数],可以直接获取对应的字符,而不需要再去判断是否在0-9和是否在10-15之间。

//main.cpp
//进制转换

#include <iostream>
#include <stack>
#include <string>
using std::cout;
using std::endl;
using std::string;
using std::stack;

class converter { //进制转换类
public:
 converter() { Clear(); }
 converter(const string& str) { Clear(); m_input = str; }
public:
 void Clear(); //初始化
 void Init(const string& str) { Clear(); m_input = m_input_ok = str; } //输入数据
 void Trim(); //去空格
 void ToNum(); //string转num
 void Dec2Bin(); //10->2
 void Dec2Oct(); //10->8
 void Dec2Hex(); //10->16
 const string& GetOutput() const { return m_output; }
 const string& GetInput() const { return m_input; }
private:
 string m_input; //输入字符串
 string m_input_ok; //处理过的输入
 string m_output; //输出字符串
 stack<char> m_st; //栈
 int m_res; //数值
};

void converter::Clear() { //初始化
 m_input = "";
 m_input_ok = "";
 m_output = "";
 while (!m_st.empty()) //清空栈
 m_st.pop();
 m_res = 0;
}

void converter::Trim() { //去空格
 string::iterator it=m_input_ok.begin();
 while (it != m_input_ok.end()) {
 if (*it == ' ')
 m_input_ok.erase(it);
 else
 ++it;
 }
}

void converter::ToNum() { //string转num
 char buff[200] = { 0 };
 memcpy(buff, m_input_ok.c_str(), 199);
 sscanf_s(buff, "%d", &m_res);
}

void converter::Dec2Bin() { //10->2
 m_output.clear();
 int res = m_res;
 while (res) {
 m_st.push(res % 2); //余数push
 res /= 2; //除2
 }
 while (!m_st.empty()) { //出栈获取结果,存入m_output
 m_output.push_back(m_st.top() + 48); //0 1 + 48 就是字符'0' '1'
 m_st.pop();
 }
}

void converter::Dec2Oct() { //10->8
 m_output.clear();
 int res = m_res;
 while (res) {
 m_st.push(res % 8); //余数push
 res /= 8; //除2
 }
 while (!m_st.empty()) { //出栈获取结果,存入m_output
 m_output.push_back(m_st.top() + 48); //数字 + 48 就是字符'0' '1' ... '8'
 m_st.pop();
 }
}

void converter::Dec2Hex() { //10->16
 m_output.clear();
 int res = m_res;
 while (res) {
 m_st.push(res % 16); //余数push
 res /= 16; //除2
 }
 while (!m_st.empty()) { //出栈获取结果,存入m_output
 m_output.push_back("0123456789ABCDEF"[m_st.top()]); //常量字符串当数组
 m_st.pop();
 }
}

int main() {
 converter x;
 x.Init(" 128");
 x.Trim();
 x.ToNum();
 x.Dec2Bin();
 cout << "输入:" << x.GetInput() << " 输出:" << x.GetOutput() << endl;

 x.Init(" 1281");
 x.Trim();
 x.ToNum();
 x.Dec2Oct();
 cout << "输入:" << x.GetInput() << " 输出:" << x.GetOutput() << endl;

 x.Init(" 49250869"); //2EF8235
 x.Trim();
 x.ToNum();
 x.Dec2Hex();
 cout <<"输入:"<<x.GetInput() <<" 输出:"<< x.GetOutput() << endl;
 return 0;
}

(2017-04-25 www.vsppc.com

学习笔记未经允许不得转载:PPC的C/C++和人工智能学习笔记 » C++语言基础(18-2)_栈的应用进制转换

分享到:更多 ()

评论 73

评论前必须登录!