2017-04-04 94 views
0

我一直在試圖弄清楚爲什麼我的代碼在過去的幾個小時內無法正常工作。一切看起來都很好,除非我不知道。我問過我的教授,但他似乎無法弄清楚。此代碼將完全忽略推動成員函數中的if else語句,並在達到極限後繼續推送(本例中爲5個元素)。當它遍歷第五個元素時,我檢查頂部,它顯示第一個實現(元素0)。我嘗試通過在範圍解析中切換類之外的成員函數來更改我的代碼,但它仍然沒有用。一個不同的眼睛將不勝感激。堆棧數組中的C++ - 問題

#include <iostream> 
#include <cctype> 
using namespace std; 

class Stack 
{ 
private: 
    static const int size = 5; 
    double myarr[size]; 
    int t; 

public: 
    Stack() { t = -1; } 
    void push(double element); 
    void pop(); 
    void top(); 
    void menu(); 
}; 

void Stack::push(double element) 
{ 
    if (t < size) { 
     t++; 
     myarr[t] = element; 
    } 
    else 
     cout << "Stack Limit Reach !!!" << endl; 
} 

void Stack::pop() 
{ 
    if (t >= 0) { 
     cout << "Element : " << myarr[t] << " was popped off the Stack " << endl; 
     t--; 
    } 
    else 
     cout << "No more elemnts in the Stack !!!" << endl; 
} 

void Stack::top() 
{ 
    if (t >= 0) { 
     cout << "Element : " << myarr[t] << " is at the top of the Stack " << endl; 
    } 
    else 
     cout << "No more elemnts in the Stack !!!" << endl; 
} 

void Stack::menu() 
{ 
    char choice = 'y'; 
    int pick; 
    double elem; 

    while (toupper(choice) == 'Y');//while(choice == 'y' || choice == 'Y'); 
    { 
     cout << "1. Push" << endl; 
     cout << "2. Pop" << endl; 
     cout << "3. Top" << endl; 
     cout << "4. Exit" << endl; 
     cin >> pick; 

     switch (pick) 
     { 
     case 1: 
      cout << "Enter the element: "; 
      cin >> elem; 
      cout << endl; 
      push(elem); 
      break; 
     case 2: 
      pop(); 
      break; 
     case 3: 
      top(); 
      break; 
     case 4: 
      choice = 'N'; 
      break; 

     default: 
      cout << "Please select 1-4" << endl; 
     } 
     system("pause"); 
    } 


} 

int main() 
{ 
    Stack obj; 
    obj.menu(); 

}; 
+1

抱歉給一個看似滑稽的評論(它不是意),但你嘗試通過它與調試器步進? 'while(toupper(choice)=='Y');'不應該以分號結尾,這可能是問題嗎? –

回答

0

在您的示例代碼,堆棧的size是5(這意味着陣列myarr具有有效索引0通過4)。

void Stack::push(double element) 
{ 
    if (t < size) { 
     t++; 
     myarr[t] = element; 
    } 
    else 
     cout << "Stack Limit Reach !!!" << endl; 
} 

考慮當t這裏是4if測試結果爲真,因此要輸入要添加到myarr的塊。首先發生的是你增加t,現在是5。然後,使用它作爲索引將值存儲到myarr,這是超出範圍。

試着這麼做:

void Stack::push(double element) 
{ 
    if (t < size) { 
     myarr[t++] = element; 
    } 
    else 
     cout << "Stack Limit Reach !!!" << endl; 
} 
+1

與此同時,你可能想在構造函數中將't'初始化爲0。否則,第一次調用彈出數組的訪問索引-1。 –

0

你跳過myArr,該[0],5個元素保存到myArr,該[5]這是第六元素myArr,該! (訪問到基於用C零++由索引的陣列的元素)

變化:

Stack() { t = -1; } 

到:

Stack() { t = 0; } 

if (t < size) { 
    t++; 
    myarr[t] = element; 

到:

if (t < size) { 
     myarr[t++] = element; 
+0

可能會更好。這種解決方案浪費元素0. – user4581301

+0

即使當t以-1開始? –

+1

一把槍的兒子。它的確從-1開始。我很抱歉。 OP正在從一個薄弱的設計工作,但這不是你的錯。 – user4581301

0

您允許6個元素被壓入堆棧,而且也僅5

更改房間:

if (t < size) { 
    t++; 

到:

if (t < size-1) { 
    t++; 
0

我明白你的問題,當你正在搜索你沒有得到的頂部元素,因爲每當堆棧變得滿爲前: -

假設你插入(下面提到的代碼)第四個索引中的第五個元素將被插入,並且t的值由於t ++而增加到5。

void Stack::push(double element) 
{ 
    if (t < size) { 
     t++; 
     myarr[t] = element; 
    } 
    else 
     cout << "Stack Limit Reach !!!" << endl; 
} 

但是當你調用頂部()功能的同時它會檢查指標,顯然5是大於0,所以它進入循環,但指數5包含「\ 0」 性格所以與編譯器的歧義

void Stack::top() 
{ 
    if (t >= 0) { 
     cout << "Element : " << myarr[t] << " is at the top of the Stack " << endl; 
    } 
    else 
     cout << "No more elemnts in the Stack !!!" << endl; 
} 

所以這需要上面的代碼的變化只是把一個if語句說的編譯器,如果堆棧滿了,然後通過1

void Stack::top() 
{ 
    if (t >= 0) { 
      if(t==size){t--;} 
     cout << "Element : " << myarr[t] << " is at the top of the Stack " << endl; 
    } 
    else 
     cout << "No more elemnts in the Stack !!!" << endl; 
} 
遞減噸價

這可能給你正確的結果