58.抽象数据类型
Stock类非常具体。然而,程序员常常通过定义类表示更通用的概念。抽象数据类型以通用的方式描述数据类型,而没有引入语言或实现细节。例如,通过使用栈,可以以这样的方式存储数据,即总是从栈顶添加或删除数据。例如,C++程序使用栈来管理自动变量。当新的自动变量被生成后,它们被添加到栈顶;消亡时,从栈中删除它们。
首先,栈存储了多个数据项(该特征使得栈成为一个容器——一种更为通用的抽象):其次,栈由可对它执行的操作来描述。
●可创建空栈
●可将数据项添加到栈顶(压入)
●可从栈顶删除数据项(弹出)
●可查看栈是否填满
●可查看栈是否空
可以将上述描述转换为一个类声明,其中公有成员函数提供了表示栈操作的接口,而私有数据成员负责存储栈数据。类概念非常适合于ADT方法。
私有部分必须表明数据存储的方式。例如,常规数组、动态分配数组或更高级的数据结构(如链表)。然而,公有接口应隐藏数据表示,而以通用的术语来表达,如创建栈、压入等。
stack.h
#pragma once
//stack.h -- 抽象数据类型的类定义
#ifndef STACK_H_
#define STACK_H_
typedef unsigned long Item;
class Stack
{
private:
enum { MAX = 10 };
Item items[MAX];
int top;
public:
Stack();
bool isempty() const;//判断栈是否
bool isfull() const;
//如果stack已经满了push()返回真否则返回假
bool push(const Item& item);//入栈
//如果stack已经空pop()返回真否则返回假
bool pop(Item& item);//出栈
};
#endif
stack.cpp
//stack.cpp -- Stack成员函数
#include "stack.h"
#pragma once
//stack.h -- 抽象数据类型的类定义
Stack::Stack()//创建空栈
{
top = 0;
}
bool Stack::isempty() const//判断栈是否
{
return top == 0;
}
bool Stack::isfull() const
{
return top == MAX;
}
//如果stack已经满了push()返回真否则返回假
bool Stack::push(const Item& item)//入栈
{
if (top < MAX)
{
items[top++] = item;
return true;
}
else
return false;
}
//如果stack已经空pop()返回真否则返回假
bool Stack::pop(Item& item)//出栈
{
if (top > 0)
{
item = items[--top];
return true;
}
else
return false;
}
stacker.cpp
#pragma warning(disable:4996)
#define _CRT_SECURE_NO_WARNINGS 1
//stacker.cpp -- 测试Stack类
#include <iostream>
#include <cctype>//或cctype.h
#include "stack.h"
using namespace std;
int main()
{
Stack st;//创建一个空栈
char ch;
unsigned long po;
cout << "请输入A入栈,\n"
<< "输入P出栈,输入Q退出。\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 << "输入PO入栈:";
cin >> po;
if (st.isfull())
cout << "栈满\n";
else
st.push(po);
break;
case 'P':
case 'p':
if (st.isempty())
cout << "栈空\n";
else
{
st.push(po);
cout << "PO # " << po << " popped\n";
}
break;
}
cout << "请输入A入栈,\n"
<< "输入P出栈,输入Q退出。\n";
}
cout << "Bye\n";
return 0;
}