顺序栈的进制转换,直接操作对象.pop()出现错误

发布于 2022-09-02 12:50:24 字数 2760 浏览 19 评论 0

用顺序栈写的代码,用来进行进制转换,转换部分都没有错误,在十进制转十六进制的时候,我的思路是先转换成对应数字压到栈里,然后出栈时在输出部分,将大于10的数字转换成字母。但是直接操作对象.pop()时,出现错误。全部代码如下:
头文件:

#include<iostream>
using namespace std;
template<class T>class SeqStack{
private:
    T data[100];
    int top;//栈顶
public:
    SeqStack(){ top = -1; };
    //~SeqStack();
    int push2(T data);
    int push8(T data);
    int push16(T data);
    T pop();//出栈操作
};


template<class T> int SeqStack<T>::push2(T ele){
    int count = 0;
    while (ele != 0){
        top++;
        data[top] = ele % 2;
        ele = ele / 2;
        count++;
    }
    return count;
}
template<class T> int SeqStack<T>::push8(T ele){
    int count = 0;
    while (ele != 0){
        top++;
        data[top] = ele % 8;
        ele = ele / 8;
        count++;
    }
    return count;
}
template<class T> int SeqStack<T>::push16(T ele){
    int count = 0;
    while (ele != 0){
        top++;
        data[top] = ele % 16;
        ele = ele / 16;
        count++;
    }
    return count;
}
template<class T> T SeqStack<T>::pop(){
    if (top == -1) return false;

    return data[top--];
}

主函数:

#include<iostream>
#include"SeqStack.h"
using namespace std;
void main(){
    SeqStack<int> s;
    int num = 0, jinzhi = 0, count;
    int arr[100];
    cout << "请输入一个十进制数:" << endl;
    cin >> num;
    cout << "请输入要转换的进制,例如2,8,16:" << endl;
    cin >> jinzhi;
    if (jinzhi == 2){
        s.push2(num);
        count = s.push2(num);
    }
    if (jinzhi == 8){
        s.push8(num);
        count = s.push8(num);
    }
    if (jinzhi == 16){
        s.push16(num);
        count = s.push16(num);
    }
    cout << "转换结束后对应的进制:" << endl;

    if (jinzhi == 2 || jinzhi == 8){
        for (int i = 1; i <= count; i++){
            cout << s.pop();
        }
    }
    if (jinzhi == 16){
        for (int i = 1; i <= count; i++){
            arr[i] = s.pop();
        }
        for (int i = 1; i <= count; i++){
            if (arr[i] >= 10){
                char x = arr[i] - 10 + 'A';
                cout << x;
            }
            else cout << arr[i];
        }
    }

    cout << endl;
    system("pause");
}


主函数里面的方法是可以输出16进制的,我把它存到数组里面了。
下面这个是直接操作出栈数据的


    if (jinzhi == 16){
    for (int i = 1; i <= count; i++){
        if (s.pop() >= 10){
            char x = s.pop() - 10 + 'A';
            cout << x;
        }
        else cout << s.pop();
    }
}

这个就不行,输出结果就是错误的
错误结果图:

 请问一下这是怎么回事

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

半暖夏伤 2022-09-09 12:50:24

因为pop()的用法有误,pop一次,就取一个数,你一次循环怎么能pop多次呢?如下改就好了:

if (jinzhi == 16){
    for (int i = 1; i <= count; i++){
        int tmp = s.pop();
        if (tmp >= 10){
            char x = tmp - 10 + 'A';
            cout << x;
        }
        else cout << tmp;
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文