今天读C++ Primer Puls 到了第十章,看到一个用类描述抽象数据类型的例子,觉得很有趣,总结一下。首先抽象数据类型就是用语言描述一个数据类型,它能干什么,做啥,并不需要用代码去实现它,这在数据结构里介绍比较多。这里用类来描述抽象数据类型,因为类就是我们自己定义的一种数据类型。
我们用类来模拟实现一个栈的操作,然后再创建一个售货员程序去调用它,常用的操作有:
1.创建空栈 2.入栈push 3.出栈pop 4.判断栈是否满 isfull 5.判断栈是否空isempty
售货员:你想一下啊,你去超市买东西,是不是要拿个推车或者购物筐,当你买完东西了,拿到售货员那要付款,她是不是要给你挨个扫一遍,她取东西的时候是不是从最上面开始取,对吧?也就是说啊,你一开始选好的东西最后被扫描,最后选的东西最先被扫描,后进先出,先进后出,这东西就是栈!下面用面向对象的思想去实现栈,再模拟售货员行为,所以,我觉得这是一个很好玩的例子,不然为啥能写在书里,好的,不废话了!看代码:
首先由一个stack.h头文件,这里放类的数据成员和要实现的功能声明
typedef unsigned long Item;//栈元素类型,你可以修改别的
class stack
{
private:
enum {MAX = 10};//枚举类型,你把这玩意暂时先理解为一个常量就可以
Item items[MAX];//定义一个Item类型的数组
int top;//指针,指向栈顶
public:
stack();//构造函数
bool isempty() const;//栈判空,后面拿个const是为了防止这个函数修改私有数据成员值的
bool isfull() const;//栈判满
bool push( const Item &item);//入栈
bool pop(Item &item);//出栈
};
在头文件声明完这些之后,再由stack.cpp去实现:
#include"stack.h"//引用头文件
stack::stack() {
top = 0;//一开始没有元素
}
bool stack::isempty()const{
return top == 0;
}
bool stack::isfull() const{
return top == MAX;//用数组存储,从0-MAX-1,存不到MAX
}
bool stack::push( const Item &item) {
if (top < MAX) {
items[top ++] = item;//从0开始存,一直到MAX-1
return true;
}
else
return false;
}
bool stack::pop(Item &item) {
if (top > 0) {
item = items[--top];//因为top指向栈顶的下一个元素,所以出栈先--
return true;
}
else
return false;
}
最后,一个stacker.cpp来模拟售货员的行为:
#include<iostream>
#include"stack.h"
using namespace std;
int main() {
stack st;//创建对象
char ch;//接受命令
unsigned long po;//存商品编号
cout << "please enter A to add purchase order,\n";
cout << "P to process a PO, or Q to quit.\n";
//输出提示性指令
while (cin >> ch && toupper(ch) != 'Q') {
// 只要键盘有输入,且输入不等于q Q就继续
while (cin.get() != '\n')
//这个是吃掉输入时的回车符的
continue;
if (!isalpha(ch)) {
//输入不是大写,就继续下一次
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" << endl;
else
st.push(po);
break;
case 'P':
case 'p':if (st.isempty())
cout << "stack already empty" << endl;
else {
st.pop(po);
cout << "PO #" << po << endl;
}
break;
}
cout << "please enter A to add purchase order,\n";
cout << "P to process a PO, or Q to quit.\n";
}
cout << "Bye" << endl;
return 0;
}
总结一下,这个代码比较简单,主要还是用类与对象的方法实现了栈,然后模拟了一下售货员取商品扫描的过程,比较贴近生活一点,这个例子是C++ Primer Puls第10章 10.7抽象数据类型一节的例子,比较经典。最近有点忙,等我后面再分享关于面向对象的其它内容,就当自己总结一下!!