2010-11-17 88 views
0

任何人都知道如何在C#中創建堆棧類,以便在不使用「System.Collections」的情況下執行諸如push,pop,peek和find之類的任務?在沒有System.Collections的情況下創建堆棧類

+3

爲什麼不愛System.Collections? – 2010-11-17 01:20:53

+2

這是功課嗎? – 2010-11-17 01:21:57

+4

@Jay Riggs:有些東西告訴我這是一個家庭作業問題,他被禁止使用'System.Collections',因爲這會**失敗點。** – Aren 2010-11-17 01:26:18

回答

4

建立一個鏈表並添加/刪除尾部?

說真的,如果你明白堆棧是如何工作的,你應該能夠很容易地創建一個堆棧。

我並不想成爲粗魯,但是你的措辭你的問題的方式使得它聽起來像你知道堆棧是什麼,只是不想只需自己寫。

鏈表將比數組更快,只需在鏈表節點上保留一個反引用,並且不僅保存頭部,而且還保存Stack類中的尾部,並且您將節省噸週期尾巴發現和添加/刪除時間。

編輯:

如果是這樣的功課,你可能會得到加分的效率,如果不是;你只需要一個快速的堆棧:對

+0

咦?對於數組,您只需將索引保留在堆棧頂部。浪費的週期在哪裏? – jason 2010-11-17 01:27:40

+0

增加大小,如果堆棧超出數組的大小,則必須重新分配一個較大的大小,並將值從舊複製到新。數組的問題:擴展,鏈接列表的問題:發現時間。我提供了一個解決方案,消除了兩種方法的缺點。 – Aren 2010-11-17 01:28:24

0

您可以構建一個鏈表:

public class Item 
{ 
    public Item next {get; set;} 
    public Item previous {get; set;} 
} 
0

你可以通過包裝用推/流行/偷看的實現數組實現堆棧。這是數據結構飼料的標準第一課程。

或者,建立自己的鏈表實現,然後用push/pop/peek實現包裝它。

-2

是的,您可以創建一個沒有任何收集的堆棧程序。

using System; 
using System.Linq; 
using System.Text; 


namespace DataStructures 
{ 
    class Stack 
    { 
     Object[] stack; 
     Int32 i; 
     Int32 j; 

     public Stack(int n) 
     { 
      stack = new Object[n]; 
      i = 0; 
      j = n; 
     } 

     public void Push(object item) 
     { 
      if (!isStackFull()) 
      { 
       stack[i++] = item; 
      } 
      else 
      Console.WriteLine("Stack is Full"); 
     } 

     public bool isStackFull() 
     { 
      if (i == j) 
       return true; 
      else 
       return false; 
     } 

     public object Pop() 
     { 
      if (stack.Length != 0) 
       return stack[--i]; 
      return -1; 
      Console.WriteLine("Stack is empty"); 
     } 

     public object TopElement() 
     { 
      if (stack.Length != 0) 
       return stack[i - 1]; 
      return 0; 
     } 
    } 

} 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Stack s = new Stack(5); 
      s.Push(5); 
      s.Push(6); 
      s.Push("string"); 
      s.Push(8); 
      s.Push("ram"); 
      s.Push(8); 
      s.Push(8); 

      Console.WriteLine("Peek: {0}", s.TopElement()); 
      Console.WriteLine("Pop: {0}", s.Pop()); 
      Console.WriteLine("Peek: {0}", s.TopElement()); 
      Console.WriteLine("pop: {0}", s.Pop()); 
      Console.Read(); 
     } 
    } 

您可以根據需要修改上述程序。

+1

這是一個很差的實現。它應該是通用的,而不是對所有東西都使用'object',所以通常期望這樣的結構在滿時動態擴展自己,而不是什麼都不做,當出現問題時應拋出異常,而不是寫入控制檯如果此類的用戶不希望用戶看到該消息,或者如果他們不使用基於控制檯的應用程序會怎麼樣?),你的peek方法可以拋出索引超出界限錯誤,並且如果堆棧有一個空數組,它不應該返回'0',它應該拋出一個異常。 – Servy 2014-03-04 17:14:54

0
class Node 
{ 
    Node next; 
    Object data; 
} 

class Stack { 

    Node Top; 

    public Node Pop() 
    { 
    if(Top==null) 
     return null; 

    Node n = Top; 
    Top = Top.Next; 
    return n; 
    } 

    public void Push(Object i) 
    { 
    Node n = new Node(i); 
    n.Next = Top; 
    Top = n; 
    } 
} 
相關問題