Bootstrap

C++ 类与对象 模拟售货员行为

今天读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抽象数据类型一节的例子,比较经典。最近有点忙,等我后面再分享关于面向对象的其它内容,就当自己总结一下!!

http://指定学习链接:https://xxetb.xetslk.com/s/4nnzpy

;