C ++ Stack数据结构,用于推送和弹出字符串和浮点数据类型

时间:2015-08-30 03:21:12

标签: c++

我编写了下面的C ++代码来实现一个可以推送和弹出整数,浮点数和字符串的堆栈。它只适用于某些价值。此外,当我第一次推送并显示它时,第一个元素后面总是有垃圾值。另外,我收到以下错误:假设我首先推送Hello并显示它,出现前面提到的问题。现在,如果我按141并显示,我看到141旁边的垃圾值。任何浮点值都是一样的。但是,如果我按1并显示,我看到旁边没有垃圾值1.我只是得到1就像我想要的那样。我该如何解决所有这些问题?感谢。

我的代码:

#include<iostream>
#include<conio.h>
#include<string.h>
using namespace std;

class stack {

private:
    char stk[10][10];
    int top;

public:

    stack()
    {
        top=-1;
    }

    void push(char x[])
    {
        int count=0,i=0,n;
        n=strlen(x);
        if(top>9)
        {cout << "Stack overflow";
        return;}
        else
        {
            top++;
            for(i=0;i<n;i++)
            {if(x[i]=='\0')
            {count=i;
            break;}
            else
            stk[top][i]=x[i];}
            return;
            for(i=count;i<n;i++)
            stk[top][i]='\0';
        }

    }

    void pop()
    {
        int i;
        if(top==-1)
        {
            cout <<"Stack underflow";
            return;
        }
        else
        cout << stk[top--];
        for(i=0;i<10;i++)
        stk[top+1][i]='\0';
    }

    void display()
    {
        if(top==-1)
        {
            cout << "Stack empty";
            return;
        }
        else
        {
            for(int i=top;i>-1;i--)
            {cout << stk[i] << endl;}
        }
    }

};

int main()
{
    char ch[10];
    int x;
    stack st;
    while(1)
    {
        cout <<"\n1.push 2.pop 3.display 4.exit\nEnter your choice ";
        cin >>x;
        switch(x)
        {
            case 1: cout <<"Enter element ";
                    cin>>ch;
                    st.push(ch);
                    break;
            case 2: st.pop(); break;
            case 3: st.display(); break;
            case 4: exit(0);
        }
    }
    return 0;
}

1 个答案:

答案 0 :(得分:2)

垃圾问题是因为在将字符串复制到堆栈时,不会终止字符串。您已尝试将null终止,但是您已将return放在空终止代码之前,因此它永远不会执行。

有很多方法可以让这些代码更好更简单,但我只提一个,使用strcpy复制一个字符串(当你不要时也不要使用return必须)。

void push(char x[])
{
    if (top >= 9)
    {
        cout << "Stack overflow";
    }
    else
    {
        top++;
        strcpy(stk[i], x);
    }
}

正如下面的评论中指出的,您对堆栈溢出的检查是不正确的。我也解决了这个问题。