C++/Generic/Generic Stack

Материал из C\C++ эксперт
Перейти к: навигация, поиск

A generic stack that holds two values.

#include <iostream>
using namespace std;
#define SIZE 10
template <class StackType> class stack {
  StackType stck[SIZE][2]; 
  int topOfStack;          
public:
  void init() { topOfStack = 0; } 
  void push(StackType ob, StackType object2); 
  StackType pop(StackType &object2); 
};
template <class StackType>
void stack<StackType>::push(StackType ob, StackType object2)
{
  if(topOfStack==SIZE) {
    cout << "Stack is full.\n";
    return;
  }
  stck[topOfStack][0] = ob;
  stck[topOfStack][1] = object2;
  topOfStack++;
}
template <class StackType> 
StackType stack<StackType>::pop(StackType &object2)
{
  if(topOfStack==0) {
    cout << "Stack is empty.\n";
    return 0; 
  }
  topOfStack--;
  object2 = stck[topOfStack][1];
  return stck[topOfStack][0];
}
int main()
{
  stack<char> stack1, stackObject2;
  int i;
  char ch;
  stack1.init();
  stackObject2.init();
  stack1.push("a", "b");
  stackObject2.push("x", "z");
  stack1.push("b", "d");
  stackObject2.push("y", "e");
  stack1.push("c", "a");
  stackObject2.push("z", "x");
  for(i = 0; i <3; i++) {
    cout << "Pop stack1: " << stack1.pop(ch);
    cout << " " << ch << endl;
  }
  for(i = 0; i <3; i++) {
    cout << "Pop stackObject2: " << stackObject2.pop(ch);
    cout << " " << ch << endl;
  }
  // demonstrate double stacks
  stack<double> doubleValueStack1, doubleValueStack2;  // create two stacks
  double d;
  doubleValueStack1.init();
  doubleValueStack2.init();
  doubleValueStack1.push(1.1, 2.0);
  doubleValueStack2.push(2.2, 3.0);
  doubleValueStack1.push(3.3, 4.0);
  doubleValueStack2.push(4.4, 5.0);
  doubleValueStack1.push(5.5, 6.0);
  doubleValueStack2.push(6.6, 7.0);
  for(i = 0; i <3; i++) {
    cout << "Pop doubleValueStack1: " << doubleValueStack1.pop(d);
    cout << " "<< d << endl;
  }
  for(i = 0; i <3; i++) {
    cout << "Pop doubleValueStack2: " << doubleValueStack2.pop(d);
    cout << " "<< d << endl;
  }
  return 0;
}


A generic stack that includes exception handling.

#include <iostream>
using namespace std;
#define SIZE 10
template <class StackType> class stack {
  StackType stck[SIZE]; 
  int topOfStack;       
public:
  void init() { 
     topOfStack = 0; 
  } 
  void push(StackType ch); 
  StackType pop();         
};
template <class StackType>
void stack<StackType>::push(StackType ob)
{
  try {
    if(topOfStack==SIZE) throw SIZE;
  } catch(int) {
    cout << "Stack is full.\n";
    return;
  }
  stck[topOfStack] = ob;
  topOfStack++;
}
template <class StackType> 
StackType stack<StackType>::pop()
{
  try {
    if( topOfStack == 0) 
      throw 0;
  } catch(int) {
    cout << "Stack is empty.\n";
    return 0;              
  }
  topOfStack--;
  return stck[topOfStack];
}
int main()
{
  stack<char> stack1, stack2;  
  int i;
  stack1.init();
  stack2.init();
  stack1.push("a");
  stack2.push("x");
  stack1.push("b");
  stack2.push("y");
  stack1.push("c");
  stack2.push("z");
  for(i = 0; i <3; i++) 
     cout << "Pop stack1: " << stack1.pop() << endl;
  for(i = 0; i <4; i++) 
     cout << "Pop stack2: " << stack2.pop() << endl;
  // demonstrate double stacks
  stack<double> doubleValueStack1, doubleValueStack2;  // create two stacks
  // initialize the stacks
  doubleValueStack1.init();
  doubleValueStack2.init();
  doubleValueStack1.push(1.1);
  doubleValueStack2.push(2.2);
  doubleValueStack1.push(3.3);
  doubleValueStack2.push(4.4);
  doubleValueStack1.push(5.5);
  doubleValueStack2.push(6.6);
  for(i = 0; i <3; i++) 
     cout << "Pop doubleValueStack1: " << doubleValueStack1.pop() << endl;
  for(i = 0; i <4; i++) 
     cout << "Pop doubleValueStack2: " << doubleValueStack2.pop() << endl;
  return 0;
}