2015-08-30 33 views
1

我寫了下面的C++代碼來實現可以推送和彈出整數,浮點數和字符串的堆棧。它工作正常只有一些價值。另外,當我第一次推東西並顯示它時,第一個元素總是在它後面有垃圾值。此外,我收到以下錯誤:假設我第一次推你好,並顯示它,前面提到的問題發生。現在,如果我推141並顯示,我會看到141旁邊的垃圾值。對於任何浮點值都是相同的。但是,如果我按1並顯示,則我看不到1旁邊的垃圾值。我只能得到1,就像我想要的那樣。我如何解決所有這些問題?謝謝。C++堆棧數據結構來推送和彈出字符串和浮點數據類型

我的代碼:

#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

如果您希望它存儲這三種不同的類型,請使用變體。它更乾淨。 – chris

+0

您正在使用哪種編譯器?這甚至不能在gcc上編譯。你的主函數缺少一個類型,你從來沒有在你的push函數中聲明'count' ... – jaggedSpire

+0

Dev C++。對於計數和主要功能類型抱歉。我編輯了這篇文章。請立即檢查。 – RaviTej310

回答

2

垃圾問題是因爲當您將它們複製到堆棧不是空終止您的字符串。您已嘗試將它們終止爲null,但在空終止代碼之前已放入return,因此它永遠不會執行。

有很多方法可以使這個代碼更好更簡單,但我會提到一個,使用strcpy複製一個字符串(並且在不需要時也不要使用return)。

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

而且正如在下面的註釋中指出的那樣,您的堆棧溢出檢查是不正確的。我也修正了這一點。