Csharp/C Sharp/Collections Data Structure/Stack

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

A stack class for characters

<source lang="csharp"> /* 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()); 
   
 }   

}

      </source>


Demonstrate the Stack class

<source lang="csharp"> /* 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."); 
   } 
 } 

}


      </source>


illustrates the use of a Stack

<source lang="csharp"> /* 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());
   }
 }

}

      </source>


Implements the stack data type using an array

<source lang="csharp"> 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) {
 }

}

      </source>


new Stack<AssemblyName>())

<source lang="csharp"> 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);
   }

}

</source>


new Stack(new int[] 6 })

<source lang="csharp"> 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());
       }
   }

}

</source>


Stack demo

<source lang="csharp"> /* 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();
      }
   }
}
          
      </source>


Stack to array

<source lang="csharp"> /* 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();
      }
   }
}
          
      </source>