Bootstrap

数字字符串格式化(用队列+栈)

问题描述

小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要精简掉。请你帮助小M编写程序,完成这个任务。


测试样例

样例1:

输入:s = "1294512.12412"
输出:'1,294,512.12412'

样例2:

输入:s = "0000123456789.99"
输出:'123,456,789.99'

样例3:

输入:s = "987654321"
输出:'987,654,321'

思路:

1.用一个队列把整数部分存起来,同时找到是否有小数点及其下标位置,用于后面添加到结果字符串中

2.把有前导0的部分去除(比如0012-->12)

3.把每一位数存到栈里面,再存到另外一个栈中,完成逆置的同时添加我们所需的逗号,示意图如下:

#include <bits/stdc++.h>
using namespace std;
string solution(const string& s) {
    queue<char> c;
    bool flag=false;
    int index=-1;
    for(int i=0;i<s.length();i++){
        if(s[i]!='.')
            c.push(s[i]);//整数部分存入一个队列中
        else {//找小数点
            flag=true;
            index=i;
            break;
        }
    }
    while(!c.empty() && c.front()=='0') c.pop();//去掉前导0
    stack<char> temp1,temp2;
    while(!c.empty()){
        temp1.push(c.front());//去除前导0的部分,把整数部分存到一个栈里
        c.pop();
    }
    int cnt=0;
    while(!temp1.empty()){
        cnt++;
        temp2.push(temp1.top());//倒过来存另外一个栈里面
        temp1.pop();
        if(cnt%3==0 && !temp1.empty()) temp2.push(',');//每三个存一个逗号,最前面的话不要存
    }
    string result;
    while(!temp2.empty()){//把这个内容存到字符串
        result.push_back(temp2.top());
        temp2.pop();
    }
    if(flag){
        result.push_back('.');
        for(int i=index+1;i<s.length();i++) result.push_back(s[i]);
    }
    return result;
}

int main() {
    cout << (solution("1294512.12412") == "1,294,512.12412") << endl;
    cout << (solution("0000123456789.99") == "123,456,789.99") << endl;
    cout << (solution("987654321") == "987,654,321") << endl;
}
;