//类模板
//stacktp.h -- a stack template
#ifndef STACKTP_H_INCLUDED
#define STACKTP_H_INCLUDED
template <typename Type>
class Stack
{
private:
enum{MAX = 10}; //constant specific to class
Type items[MAX]; //holds stack items
int top; //index for top stack item
public:
Stack();
bool isempty();
bool isfull();
bool push(const Type & item); //add item to stack
bool pop(Type & Item); //pop top into item
};
template <typename Type>
Stack<Type>::Stack()
{
top = 0;
}
template<typename Type>
bool Stack<Type>::isempty()
{
return top == 0;
}
template <typename Type>
bool Stack<Type>::isfull()
{
return top == MAX;
}
template <typename Type>
bool Stack<Type>::push(const Type & item)
{
if(top < MAX)
{
items[top] = item;
top++;
return true;
}
else
{
return false;
}
}
template <typename Type>
bool Stack<Type>::pop(Type & item)
{
if(top > 0)
{
top--;
item = items[top];
return true;
}
else
{
return false;
}
}
#endif
//stacktem.cpp
//stacktem.cpp -- testing the template stack class
#include <iostream>
#include <string>
#include <cctype>
#include "stacktp.h"
using std::cin;
using std::cout;
//using std::toupper;
int main()
{
Stack<std::string> st; //create an empty stack
char ch;
std::string po;
//char *po;
//char po[40];
//char * po = new char[40];
cout<< "Please enter A to add a purchase order.\n"
<< "P to process a PO,or Q to Quit.\n";
while(cin >> ch && /*std::*/toupper(ch)!='Q')//不是STD中的
{
while(cin.get()!='\n')
{
continue;
}
if(!/*std::*/isalpha(ch))//不是STD中的
{
cout<<'\a';
continue;
}
switch(ch)
{
case 'A':
case 'a':
{
cout<<"Enter a PO number to add:";
cin>>po;
if(st.isfull())
{
cout<<"stack already full\n.";
}
else
{
st.push(po);
}
break;
}
case 'P':
case 'p':
{
if(st.isempty())
{
cout<<"stack already empty\n";
}
else
{
st.pop(po);
cout<<"PO #"<<po<<" poped.\n";
}
break;
}
}
cout<< "Please enter A to add a purchase order.\n"
<< "P to process a PO,or Q to Quit.\n";
}
cin>>ch;
cout << "Bye\n";
return 0;
}