2010-11-17 87 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; 
    } 
} 
相关问题