我编写了下面的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;
}
答案 0 :(得分:2)
垃圾问题是因为在将字符串复制到堆栈时,不会终止字符串。您已尝试将null终止,但是您已将return
放在空终止代码之前,因此它永远不会执行。
有很多方法可以让这些代码更好更简单,但我只提一个,使用strcpy
复制一个字符串(当你不要时也不要使用return
必须)。
void push(char x[])
{
if (top >= 9)
{
cout << "Stack overflow";
}
else
{
top++;
strcpy(stk[i], x);
}
}
正如下面的评论中指出的,您对堆栈溢出的检查是不正确的。我也解决了这个问题。