本文涉及到的知识点有:抽象数据类型(ADT),栈(stack),类定义等,
类很适合用于描述ADT,共有成员函数提供了ADT描述服务,而类的私有部分和类方法代码提供了实现,但这些实现对客户是隐藏的。
参考文献:C++primer plus第六版
头文件stach.h :
//P373---10.10--类定义应用于抽象数据类型--栈
//1.作用域内枚举
//2.对象数组
#ifndef STACK_H_
#define STACK_H_
typedef unsigned long ITEM;//使用typedef便于修改
//calss definition
class Stack
{
private:
enum { MAX=10 };//作用域内枚举,不提供枚举名,是因为不创建枚举变量,MAX为符号常量
ITEM items[MAX];//创建对象数组,items数组名
int top;
public:
//function prototype
Stack();//default constructor
bool isempty() const;
bool isfull() const;
bool push(const ITEM &item);//判断栈是否填满返回bool
bool pop(ITEM &item);//判断栈是否为空返回bool值
};
#endif
注:本段代码作为头文件主要是类的声明和定义,
源文件List10.11 :
//P374---10.11---定义成员函数
//将引用作函数参数,使得函数中的变量名成为调用函数中的变量
//*****
//函数定义
#include"stack.h"
Stack::Stack()
{
top = 0;
}
bool Stack::isempty()const //const表示不能修改隐式访问的对象
{
return top == 0;
}
bool Stack::isfull()const
{
return top == MAX;
}
bool Stack::push(const ITEM& item)//新类型:ITEM& ,item为指向ITEM的引用,在函数push被调用时,形参item被初始化为实参
{
if (top < MAX)
{
items[top++] = item;//向栈顶添加数据项
return true;
}
else
return false;
}
bool Stack::pop(ITEM&item)
{
if (top>0)
{
item = items[--top];//从栈顶删除数据项
return true;
}
else
return false;
}
源文件List10.12 :
//P375---10.12--测试类stack
//函数调用
#include<iostream>
#include<cctype>
#include"stack.h"
int main()
{
using namespace std;
Stack stk;
char ch;
cout << "****";
cout << ULONG_MAX;
cout << "****" << endl<<endl;
unsigned long po;
cout << "Please enter a character: A ,P or Q" << endl
<<"A to add a pcuhcase order,\n"
<< "P to process a Pop\nQ to quit.\n";
while ( cin>>ch &&toupper(ch)!='Q')
{
while (cin.get() != '\n')
continue;
if (!isalpha(ch))
{
cout << "\a";
continue;
}
switch (ch)
{
case'A':
case'a':cout << "Entera PO number to add: ";
cin >> po;
//判断栈是否填满,压入数据项
if (stk.isfull())
cout << "stack already full!\n";
else
stk.push(po);
break;
//判断栈是否为空,弹出数据项
case'P':
case'p':if (stk.isempty())
cout << "stack already empty\n";
else
{
stk.pop(po);
cout << "PO #" << po << " popped\n";
}
break;
break;
}
cout << "Please enter A to add a purchase order,\n"
<< "P to process a PO ,or Q to quit.\n";
}
cout << "Bye \n";
return 0;
}