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;
}
posted @ 2023-02-24 19:57  CodeMagicianT  阅读(56)  评论(0编辑  收藏  举报