使用类来简单地实现栈的基本功能

使用类来简单地实现栈的基本功能,第1张

C++ Primer PLus 第十章 对象和类 编程练习第五题

5.考虑下面的结构声明:
struct customer {
char fullname[35];
double payment;
};
编写一个程序,它从栈中添加和删除customer结构(栈用Stack类声明表示)。每次customer结构被删除时,其payment的值被加入到总数中,并报告总数。注意:应该可以直接使用Stack类而不作修改;只修改typedef声明,使Item的类型为customer,而不是unsigned long即可。

栈是一种后进先出的抽象数据类型 这里用整型int栈顶“指针”指向栈的下一个空位置,如数组存储了一个数据在arr[0],然后“指针”+1指向第二个位置arr【1】,以此类推,直到超出了数组范围,表示栈已满。

int top=0; //栈顶“指针”,显示当前栈为空
top++; //指向下一个数组位置

Stack类的数据成员和函数成员声明文件
#ifndef STACK_H_                 //防止头文件被重复引用并编译
#define STACK_H_

struct customer {                   /*结构customer声明*/
	char fullname[35]="";           /*数组初始化设值,变量payment初始化设值*/
	double payment=0.0;
};

typedef customer Item;              //设置customer别名Item
 class Stack                        //Stack类声明
 {
	private:
		enum{MAX=10};               //通过枚举的方法可以设置在该类中使用的常量MAX=10
		Item stack[MAX];            //栈,容量为10,存储的类型为结构customer 
		int top;                    //栈顶“指针”,指示栈顶

	public:                     
		Stack();                    //Stack类默认构造函数
		~Stack() {};                  //析构函数
		bool isempty()const;          //判断栈是否为空,也就是top是否为0
		bool isfull()const;           //判断栈是否已满,也就是top是否为10
		bool push(const Item&item);    //入栈,压入数据,压入后,栈顶“指针”+1
		bool pop(Item&item);           //出栈,d出数据,栈顶“指针”先-1后再d出

 };
#endif
Stack类成员函数的功能实现文件
#include
#include"stack.h"      //包含类声明头文件
using std::cin;
using std::cout;
using std::endl;

//Stack类的默认构造函数定义
Stack::Stack()
{
	top = 0;                        //初始化栈顶“指针”,为0,表示栈为空,Stack类的数据成员stack数组
}                                  // 存储customer的个数为0*

//判断栈是否为空(数组stack是否为空)
bool Stack::isempty()const          /*const指示不对stack类的数据成员进行修改,若修改编程将提示*/
{                             
	if (top == 0)                   //若top==0,表示栈为空,返回true,否则返回false
		return true;
	else
		return false;
}

//判断栈是否已满(数组stack是否已满)
bool Stack::isfull()const
{
	if (top < 10)                     //若top小于10,返回false,表示未满,否则已满返回true
		return false;
	else
		return true;
}

//入栈,数组stack存储数据
bool Stack::push(const Item&item)            //参数为item的引用,也就是customer结构的引用
{
	if (top<MAX)                             //top小于10的话就入栈
	{
		stack[top++] = item;      //将外部输入好的数据存储到top当前指向的位置,然后top+1指向下一个
		cout << "Stack remains " << MAX - top << " spaces."<<endl;  //空位置并显示剩下多少空间
		return true;
			
	}
	else
	{
		return false;                       //top等于10表示栈满,返回false,不进行 *** 作
	}
}

//出栈,d出数据
bool Stack::pop(Item&item)
{
	if (top>0)                      //top大于0,表示栈还有数据可以进行出栈 *** 作
	{
		item = stack[--top];        //top先自减1,指向当前要出栈的数据,出栈后top指向的就是下一个
		cout << "Stack remains " << MAX - top << " spaces." << endl;  //入栈的空位置并显示剩余空间
		return true;
	}
	else
	{
		return false;               //top不大于0,也就是为0,栈无任何数据,返回false,不执行任何 *** 作
	}
}
主程序文件
#include
#include"stack.h"   //类的声明文件
using std::cin;
using std::cout;
using std::endl;
int main()
{
	Stack stack01;         //程序创建栈并自动调用默认构造函数初始化栈,当前栈为空,top为0
	double sum = 0.0;      //每次出栈都记录payment总数
	Item cus;              //创建Item,也就是customer结构变量,以获取栈要存储的数据
	char ch;               //菜单 *** 作按钮,输入字符a或A表示入栈,p或P表示出栈,q或Q表示退出程序
	cout << "Please enter A to add a customer data, \n"
		<< "p to process a customer, or q to quit.\n";

	while (cin >> ch && toupper(ch) != 'Q')    //输入循环,直到输入Q或q退出循环
	{
		while (cin.get() != '\n')  //变量ch只获取一个字符,若输入多个字符则用cin.get()获取除第一个
			continue;      //字符之后余下的字符直到回车符,以免影响后续输入,如输入“asd”->只读取‘a’
			
		if (!isalpha(ch))                 //判断变量ch是否字母,如果不是则提示重新输入
		{
			cout << '\a';
			cout << "Please enter A to add a customer data, \n"
				<< "p to process a customer, or q to quit.\n";
			continue;                     //回到while继续下一轮的循环而不执行当前循环剩下的 *** 作
		}
		
		switch (ch)                 //Switch分支语句,对输入的字符ch进行判断
		{
		case 'A':                    
		case 'a':
			if (stack01.isfull())     //A或a表示要入栈,先判断栈是否满,满就提示已满然后不执行 *** 作
				cout << "Stack is full. Can not push any data at it." << endl;	
			else                     //未满则执行入栈 *** 作
			{
				cout << "Enter the customer fullname: ";
				cin.getline(cus.fullname, 34);      //输入名字,存储在变量cus.fullname数组里
				cout << "Enter the payment: ";
				cin >> cus.payment;                //输入付款,存储在变量cus.payment里
				cin.get();    //清除留在缓存队列里的回车键以免下一次名字输入直接存储出现程序未知错误
				stack01.push(cus);      //将变量cus里保存好的数据存到stack01栈里
			}
			break;
			
		case 'P':
		case 'p':
			if (stack01.isempty())      //P或p表示要出栈,先判断栈是否空,空就提示无数据不执行 *** 作
			{
				cout << "Stack is empty now. No any data be here."<<endl;
			}
			else                        //不是空表示有数据可以执行出栈 *** 作
			{
				stack01.pop(cus);       //把stack01栈里的最上面那个数据项存储到变量cus里,表示出栈
				sum += cus.payment;     //然后将出栈的数据项里的payment加到变量sum里并显示
				cout << "Payment: " << sum << endl;
			}
			break;

		}
		cout << endl;                              //下一轮循环
		cout << "Please enter A to add a customer data, \n"
			<< "p to process a customer, or q to quit.\n";
	}
	cout << "Done.";               //循环结束,退出程序
	return 0;
}
程序结果运行图 入栈 *** 作 存储第一个数据项在栈里

存储第二个数据项在栈里

存储最后一个数据项在栈里

出栈 *** 作 d出一个数据项

d出两个数据项

d出最后一个数据项

退出程序

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/2889344.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-14
下一篇 2022-09-14

发表评论

登录后才能评论

评论列表(0条)

保存