2012-04-29 93 views
0

我對這個網站不熟悉,並且會盡力按照我的要求做出貢獻。此外,請知道我從來沒有花費太多時間試圖自己弄清楚問題。因此,C++ Stacks讓我瘋狂。對C++堆棧使用感到困惑

我的問題:我在哪裏將我的變量/值放在堆棧功能塊中以實際使用它。我明白棧是一個LIFO數據結構,我讀過這段代碼在彼此的頂部堆疊板等

看的例子不勝枚舉:

#include <iostream> 
using namespace std; 

const int MAX_SIZE = 100; 

class StackOverFlowException 
{ 
    public: 
     StackOverFlowException() 
     { 
      cout << "Stack overflow" << endl; 
     } 
}; 

class StackUnderFlowException 
{ 
    public: 
     StackUnderFlowException() 
     { 
      cout << "Stack underflow" << endl; 
     } 
}; 

class ArrayStack 
{  
    private:   
     int data[MAX_SIZE];   
     int top;  
    public:   
     ArrayStack() 
     {    
      top = -1;   
    }   

    void Push(int element) 
    {    
     if (top >= MAX_SIZE) 
      {    
       throw new StackOverFlowException(); 
      }     
      data[++top] = element;   
    }   

    int Pop() 
    {    
     if (top == -1) 
      {    
       throw new StackUnderFlowException();    
      }    
      return data[top--];   
    }   

    int Top() 
    {    
     return data[top];   
    } 

    int Size() 
    { 
     return top + 1; 
    } 

    bool isEmpty() 
    { 
     return (top == -1) ? true : false; 
    } 
}; 

[等等... 。]

這是基本的餅乾.... 比方說,我試圖調整它,以表達一個系統,最後的食物訂單放在哪裏,先被踢出;變量是'食物','訂單'以及其他任何東西。 我在世界的哪個地方將這些變量集成到上面的堆棧代碼中!?!??!

請幫助很困惑我即將胡亂衝的東西

+9

這將是一個可怕的餐廳。 –

+0

基本上你想「推」你的訂單在堆棧上,然後「彈出」它們。 – Sword22

+1

第一個訂購的人永遠等待...... – dreamlax

回答

1

的數據類型,以及那什麼最流行&回報,什麼推帶一個參數,是什麼,是包含在堆棧;這就是你想要替換的任何類型。

1

這是一個堆棧:

stack

認爲它是這樣的:只有這樣,才能不動,別人加了一本書,是把它放到最上面:這是什麼Push呢。所以通過調用Push(Book1),您可以將Book1放置在堆的頂部。

同樣,拿走一本書而不移動其他的唯一方法就是將其中一個放在最上面:這就是Pop所做的。因此,通過調用Pop(),你會得到(並從堆棧中移除),無論哪本書在堆棧頂部,圖中的書都是綠皮書。

我錯過了什麼,或者這是你的問題嗎?

4

一個堆棧實現可以使用模板,以便你可以把任何你想要的堆棧(在合理範圍內)。

例如,有一個類,封裝了所有相關的訂單數據(這個只是一個例子):

class FoodOrder 
{ 
    int orderNumber; 
    time_t orderTime; 

    // add more variables here 
} 

然後,你的籌碼看起來是這樣的:

template<typename T> class Stack 
{ 
    T data[MAX_SIZE]; 
    int top; 

    void Push(T item); 
    T Pop(void); 

    // add methods 
} 

那麼,你可以有一個Stack任何你想要的物品:

Stack<int> stackOfInts; 
Stack<std::string> stackOfStrings; 
Stack<FoodOrder> stackOfOrders; 
2

我們E中的現有std::stack和包裹,如果你想例外,例如像這樣(請注意,你可以很容易模板化的話):

class protectedstack 
{ 
private: 
    std::stack<int> stack; 
    const int myarbitraryupperlimit = 100; 
public: 
    void pop() 
    { 
     if(stack.empty()) 
     { 
      throw new StackUnderFlowException();    
     } 
     stack.pop(); 
    } 
    void push(const int& value) 
    { 
     if(stack.size()>=myarbitraryupperlimit) 
     { 
      throw new StackOverFlowException(); 
     } 
     stack.push(value); 
    } 
    // Similar for top/empty/constructors/... 
}; 
+0

我很確定這是作業或學習練習。 –

+0

@MooingDuck:那麼它應該被指定爲 – KillianDS

1

這一切都在top變量。這個變量決定哪個對象是當前頂部。當你pop(),那麼top變量就會減少 - 這意味着頂端現在低於原來的位置。當你push(),它增加了 - 頂部現在是一個以上的地方。這個變量是堆棧的LIFO功能的原因。

你當然可以用template這個類來使它與FoodOrder或其他什麼一起工作。

+0

只是當前的堆棧索引在「頂部」。實際的數據/值(他所要求的)在「數據」數組中。他已經釘上了「頂尖」的東西。 – Hejazzman

1

我不明白爲什麼混淆。數據會進入,「數據」變量。

因此,您要麼使用模板,要使數據緩衝區能夠容納任何東西,要麼將數據類型更改爲您特別需要的數據類型。

舉例來說,如果你有一個FoodOrder類,你可以做這樣的(我的C++是鏽跡斑斑,但是這基本上是它的要點):

FoodOrder *數據[MAX_SIZE];

您必須更改推送/彈出參數才能相應地接受FoodOrder指針/引用,然後設置好。

P.S.關於使用std :: stack - 這可能是一個更好的解決方案,但沒有回答他的具體問題。

第2頁海報寫道:「我是這個網站的新手,會盡我所能地貢獻自己的力量。」真?那他爲什麼還沒有選擇答案呢?這味道更像是家庭作業嗎?