Csharp/C Sharp/Collections Data Structure/Stack

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

A stack class for characters

/*
C#: The Complete Reference 
by Herbert Schildt 
Publisher: Osborne/McGraw-Hill (March 8, 2002)
ISBN: 0072134852
*/
// A stack class for characters.   
  
using System;  
  
class Stack {   
  // these members are private 
  char[] stck; // holds the stack  
  int tos;     // index of the top of the stack  
   
  // Construct an empty Stack given its size.  
  public Stack(int size) {   
    stck = new char[size]; // allocate memory for stack  
    tos = 0;   
  }   
  
  // Push characters onto the stack.  
  public void push(char ch) {   
    if(tos==stck.Length) {   
      Console.WriteLine(" -- Stack is full.");   
      return;   
    }   
       
    stck[tos] = ch;  
    tos++;  
  }   
   
  // Pop a character from the stack.  
  public char pop() {   
    if(tos==0) {   
      Console.WriteLine(" -- Stack is empty.");   
      return (char) 0;    
    }   
     
    tos--;   
    return stck[tos];   
  } 
 
  // Return true if the stack is full. 
  public bool full() { 
    return tos==stck.Length;    
  } 
 
  // Return true if the stack is empty. 
  public bool empty() { 
    return tos==0; 
  } 
 
  // Return total capacity of the stack. 
  public int capacity() { 
    return stck.Length; 
  } 
 
  // Return number of objects currently on the stack. 
  public int getNum() { 
    return tos; 
  } 
}  
// Demonstrate the Stack class.   
 
public class StackDemo31 {   
  public static void Main() {   
    Stack stk1 = new Stack(10);   
    Stack stk2 = new Stack(10);   
    Stack stk3 = new Stack(10);   
    char ch;   
    int i;   
   
    // Put some characters into stk1. 
    Console.WriteLine("Push A through Z onto stk1."); 
    for(i=0; !stk1.full(); i++)   
      stk1.push((char) ("A" + i));   
  
    if(stk1.full()) Console.WriteLine("stk1 is full."); 
 
    // Display the contents of stk1. 
    Console.Write("Contents of stk1: ");   
    while( !stk1.empty() ) {    
      ch = stk1.pop();   
      Console.Write(ch);   
    }   
   
    Console.WriteLine();   
 
    if(stk1.empty()) Console.WriteLine("stk1 is empty.\n"); 
   
    // put more characters into stk1   
    Console.WriteLine("Again push A through Z onto stk1."); 
    for(i=0; !stk1.full(); i++)   
      stk1.push((char) ("A" + i));   
 
    /* Now, pop from stk1 and push the element in stk2. 
       this causes stk2 to hold the elements in  
       reverse order. */ 
    Console.WriteLine("Now, pop chars from stk1 and push " + 
                      "them onto stk2."); 
    while( !stk1.empty() ) {    
      ch = stk1.pop();   
      stk2.push(ch); 
    }   
 
    Console.Write("Contents of stk2: ");   
    while( !stk2.empty() ) {    
      ch = stk2.pop();   
      Console.Write(ch);   
    }   
 
    Console.WriteLine("\n"); 
 
    // put 5 characters into stack 
    Console.WriteLine("Put 5 characters on stk3."); 
    for(i=0; i < 5; i++)   
      stk3.push((char) ("A" + i));   
 
    Console.WriteLine("Capacity of stk3: " + stk3.capacity()); 
    Console.WriteLine("Number of objects in stk3: " + 
                      stk3.getNum()); 
    
  }   
}


Demonstrate the Stack class

/*
C#: The Complete Reference 
by Herbert Schildt 
Publisher: Osborne/McGraw-Hill (March 8, 2002)
ISBN: 0072134852
*/
// Demonstrate the Stack class. 
 
using System; 
using System.Collections; 
  
public class StackDemo5 { 
  static void showPush(Stack st, int a) { 
    st.Push(a); 
    Console.WriteLine("Push(" + a + ")"); 
 
    Console.Write("stack: "); 
    foreach(int i in st) 
      Console.Write(i + " "); 
 
    Console.WriteLine();         
  } 
 
  static void showPop(Stack st) { 
    Console.Write("Pop -> "); 
    int a = (int) st.Pop(); 
    Console.WriteLine(a); 
 
    Console.Write("stack: "); 
    foreach(int i in st) 
      Console.Write(i + " "); 
 
    Console.WriteLine();         
  } 
 
  public static void Main() { 
    Stack st = new Stack(); 
 
    foreach(int i in st) 
      Console.Write(i + " "); 
 
    Console.WriteLine();         
 
    showPush(st, 22); 
    showPush(st, 65); 
    showPush(st, 91); 
    showPop(st); 
    showPop(st); 
    showPop(st); 
 
    try { 
      showPop(st); 
    } catch (InvalidOperationException) { 
      Console.WriteLine("Stack empty."); 
    } 
  } 
}


illustrates the use of a Stack

/*
Mastering Visual C# .NET
by Jason Price, Mike Gunderloy
Publisher: Sybex;
ISBN: 0782129110
*/
/*
  Example11_11.cs illustrates the use of a Stack
*/
using System;
using System.Collections;
public class Example11_11
{
  public static void Main()
  {
    // create a Stack object
    Stack myStack = new Stack();
    // add four elements to myStack using the Push() method
    myStack.Push("This");
    myStack.Push("is");
    myStack.Push("a");
    myStack.Push("test");
    // display the elements in myStack
    foreach (string myString in myStack)
    {
      Console.WriteLine("myString = " + myString);
    }
    // get the number of elements in myStack using the
    // Count property
    int numElements = myStack.Count;
    for (int count = 0; count < numElements; count++)
    {
      // examine an element in myStack using Peek()
      Console.WriteLine("myStack.Peek() = " +
        myStack.Peek());
      // remove an element from myStack using Pop()
      Console.WriteLine("myStack.Pop() = " +
        myStack.Pop());
    }
  }
}


Implements the stack data type using an array

using System;
public class Stack {
  private int[] data;
  private int size;
  private int top = -1;
  public Stack() { 
    size = 10;
    data = new int[size];
  }
  public Stack(int size) {
    this.size = size;
    data = new int[size];
  }       
  public bool IsEmpty() {
    return top == -1;
  }
  public bool IsFull() {
    return top == size - 1;
  }
  public void Push(int i){
    if (IsFull())
      throw new ApplicationException("Stack full");
    else
      data[++top] = i;
  }
  public int Pop(){
    if (IsEmpty())
       throw new StackEmptyException("Stack empty");
    else
       return data[top--];
  }
  public int Top(){
    if (IsEmpty()) 
      throw new StackEmptyException("Stack empty");
    else
      return data[top];
  }
  public static void Main() {
    try {
      Stack stack1 = new Stack(); 
      stack1.Push(4);
      stack1.Push(5);
      Console.WriteLine("The top is now {0}", stack1.Top());
      stack1.Push(6);
      Console.WriteLine("Popping stack returns {0}", stack1.Pop());
      Console.WriteLine("Stack 1 has size {0}", stack1.size);
      Console.WriteLine("Stack 1 empty? {0}", stack1.IsEmpty());
      stack1.Pop();
      Console.WriteLine("Throws exception before we get here");
    }catch(Exception e) {
        Console.WriteLine(e);
    }
  }
}

class StackEmptyException : ApplicationException {
  public StackEmptyException(String message) : base(message) {
  }
}


new Stack<AssemblyName>())

 
using System;
using System.Reflection;
using System.Collections.Generic;
class MainClass {
    public static void Main(string[] args) {
        AssemblyName assembly1 = new AssemblyName("com.microsoft.crypto, Culture=en, PublicKeyToken=a5d015c7d5a0b012, Version=1.0.0.0");
        Stack<AssemblyName> assemblyStack = new Stack<AssemblyName>();
        assemblyStack.Push(assembly1);
        AssemblyName ass3 = assemblyStack.Pop();
        Console.WriteLine("\nPopped AssemblyName from stack: {0}", ass3);
    }
}


new Stack(new int[] 6 })

 
using System;
using System.Collections;
public class Starter {
    public static void Main() {
        Stack numbers = new Stack(new int[] { 1, 2, 3, 4, 5, 6 });
        int total = numbers.Count;
        for (int count = 0; count < total; ++count) {
            Console.WriteLine(numbers.Pop());
        }
    }
}


Stack demo

/*
Learning C# 
by Jesse Liberty
Publisher: O"Reilly 
ISBN: 0596003765
*/
 using System;
 using System.Collections;
 namespace StackDemo
 {
    public class TesterStackDemo
    {
       public void Run()
       {
           Stack intStack = new Stack();
           // populate the array
           for (int i = 0;i<8;i++)
           {
               intStack.Push(i*5);
           }
           // Display the Stack.
           Console.Write( "intStack values:\t" );
           DisplayValues( intStack );
           // Remove an element from the stack.
           Console.WriteLine( "\n(Pop)\t{0}",
               intStack.Pop() );
           // Display the Stack.
           Console.Write( "intStack values:\t" );
           DisplayValues( intStack );
           // Remove another element from the stack.
           Console.WriteLine( "\n(Pop)\t{0}",
               intStack.Pop() );
           // Display the Stack.
           Console.Write( "intStack values:\t" );
           DisplayValues( intStack );
           // View the first element in the
           // Stack but do not remove.
           Console.WriteLine( "\n(Peek)   \t{0}",
               intStack.Peek() );
           // Display the Stack.
           Console.Write( "intStack values:\t" );
           DisplayValues( intStack );
       }
        public static void DisplayValues(
            IEnumerable myCollection )
        {
            foreach (object o in myCollection)
            {
                Console.WriteLine(o);
            }
        }
       [STAThread]
       static void Main()
       {
          TesterStackDemo t = new TesterStackDemo();
          t.Run();
       }
    }
 }


Stack to array

/*
Learning C# 
by Jesse Liberty
Publisher: O"Reilly 
ISBN: 0596003765
*/
 using System;
 using System.Collections;
 namespace StackDemo
 {
    public class TesterStackArray
    {
       public void Run()
       {
           Stack intStack = new Stack();
           // populate the array
           for (int i = 1;i<5;i++)
           {
               intStack.Push(i*5);
           }
           // Display the Stack.
           Console.WriteLine( "intStack values:" );
           DisplayValues( intStack );

           const int arraySize = 10;
           int[] testArray = new int[arraySize];
           // populate the array
           for (int i = 1; i < arraySize; i++)
           {
               testArray[i] = i * 100;
           }
           Console.WriteLine("\nContents of the test array");
           DisplayValues( testArray );
           // Copy the intStack into the new array, start offset 3
           intStack.CopyTo( testArray, 3 );
           Console.WriteLine( "\nTestArray after copy:  ");
           DisplayValues( testArray );

           // Copy the entire source Stack
           // to a new standard array.
           Object[] myArray = intStack.ToArray();
           // Display the values of the new standard array.
           Console.WriteLine( "\nThe new  array:" );
           DisplayValues( myArray );
       }
        public static void DisplayValues(
            IEnumerable myCollection )
        {
            foreach (object o in myCollection)
            {
                Console.WriteLine(o);
            }
        }
       [STAThread]
       static void Main()
       {
          TesterStackArray t = new TesterStackArray();
          t.Run();
       }
    }
 }