C++编程练习(1)——数据结构 之 链式栈 的实现

数据结构 之 链式栈 的实现

使用工具:VS2019

功能:

1、实现链式栈的基本功能
2、使用面向对象完成

软件下载:

点击进入CSDN的下载界面


一、代码部分

头文件MyStack.h:

#pragma once
#include <iostream>
#include <string>
using namespace std;

// ADT 抽象数据类型
class MyStack
{
    
    
public:
	// 析构函数
	virtual ~MyStack();
	// 判断栈空
	virtual bool StackEmpty() const = 0;
	// 获取栈的大小
	virtual int StackSize() const = 0;
	// 获取栈顶元素
	virtual int& StackTopElement() = 0;
	// 入栈
	virtual void StackPush(const int& element) = 0;
	// 出栈
	virtual void StackPop() = 0;
	// 展示所有栈中的元素
	virtual void StackShow() const = 0;
};

// 数据结点
struct MyNode
{
    
    
	int data;
	MyNode* next;
	MyNode(int data = -1, MyNode* next = nullptr);
};

// 链式栈
class MyListStack :public MyStack
{
    
    
public:
	MyListStack(MyNode* stackTop = nullptr, int stackSize = 0);
	~MyListStack();

	// 判断栈空
	bool StackEmpty() const;
	// 获取栈的大小
	int StackSize() const;
	// 获取栈顶元素
	int& StackTopElement();
	// 入栈
	void StackPush(const int& element);
	// 出栈
	void StackPop();
	// 展示所有栈中的元素
	void StackShow() const;
protected:
	MyNode* stackTop;
	int stackSize;
};

MyStack.c:

#include "MyStack.h"

// 析构函数
MyStack::~MyStack()
{
    
    
}
// 参数列表初始化
MyNode::MyNode(int data, MyNode* next) :data(data), next(next)
{
    
    
}
// 参数列表初始化
MyListStack::MyListStack(MyNode* stackTop, int stackSize) : stackTop(stackTop), stackSize(stackSize)
{
    
    
}
MyListStack::~MyListStack()
{
    
    
	delete stackTop;
	stackSize = 0;
}
// 判断栈空
bool MyListStack::StackEmpty() const
{
    
    
	return stackSize == 0;			// 栈空返回true
}

int MyListStack::StackSize() const
{
    
    
	return stackSize;
}

int& MyListStack::StackTopElement()
{
    
    
	if (!StackEmpty())
	{
    
    
		return stackTop->data;
	}
	else
	{
    
    
		cout << "栈空,无法获取栈顶元素" << endl << endl;
		exit(0);
	}
}
// 入栈
void MyListStack::StackPush(const int& element)
{
    
    
	MyNode* newNode = new MyNode(element, stackTop);
	stackTop = newNode;

	stackSize++;				// 栈的大小+1
}
// 出栈
void MyListStack::StackPop()
{
    
    
	if (!StackEmpty())
	{
    
    
		MyNode* stackTopNext = stackTop->next;
		delete stackTop;
		stackTop = stackTopNext;

		stackSize--;			// 栈的大小-1
	}
	else
	{
    
    
		cout << "栈空,无法出栈" << endl << endl;
		exit(0);
	}
}
// 展示所有栈中的元素
void MyListStack::StackShow() const
{
    
    
	if (!StackEmpty())
	{
    
    
		MyNode* pMove = stackTop;
		while (pMove)
		{
    
    
			cout << pMove->data << "\t";
			pMove = pMove->next;
		}
		cout << endl << endl;
	}
	else
	{
    
    
		cout << "栈空,无法展示所有数据" << endl << endl;
		exit(0);
	}
}

main.c:

#include "MyStack.h"

/*
	@author	:	LZY
	@date	:	2021/3/30 10:54:02
	@theme	:	针对 链式栈 的学习和实现
*/

void MainMenu();

int main()
{
    
    
	int choice;
	int data = -1;
	MyStack* pMyListStack = new MyListStack();

	while (true)
	{
    
    
		MainMenu();

		cout << "选择功能:";
		cin >> choice;
		switch (choice)
		{
    
    
		case 1:
			cout << "输入要输入的数据:";
			cin >> data;
			pMyListStack->StackPush(data);
			cout << "入栈成功" << endl << endl;
			break;
		case 2:
			pMyListStack->StackPop();
			cout << "出栈成功" << endl << endl;
			break;
		case 3:
			cout << "栈顶元素为:" << pMyListStack->StackTopElement() << endl << endl;
			break;
		case 4:
			cout << boolalpha << "栈是否为空:" << pMyListStack->StackEmpty() << endl << endl;
			break;
		case 5:
			cout << "栈此时的大小为:" << pMyListStack->StackSize() << endl << endl;
			break;
		case 6:
			pMyListStack->StackShow();
			break;
		default:
			break;
		}
		system("pause");
		system("cls");
	}

	return 0;
}

void MainMenu()
{
    
    
	cout << "----------链式栈----------" << endl;
	cout << "|         1.入栈         |" << endl;
	cout << "|         2.出栈         |" << endl;
	cout << "|         3.栈顶         |" << endl;
	cout << "|         4.栈空         |" << endl;
	cout << "|         5.大小         |" << endl;
	cout << "|         6.展示         |" << endl;
	cout << "--------------------------" << endl << endl;
}

二、运行结果

1.入栈(首先入栈三个数据:100、150、300)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.展示链式栈中的数据

在这里插入图片描述

3.此时栈中的大小为多少?

在这里插入图片描述

4.查看栈顶元素

在这里插入图片描述

5.此时查看链式栈是否为空,若栈为空,输出true

在这里插入图片描述

6.出个栈试一下

在这里插入图片描述

7.出栈完成,展示当前栈中的数据

在这里插入图片描述

8.此时栈的大小为?

在这里插入图片描述

三、最终总结

实现了想要实现的功能。

猜你喜欢

转载自blog.csdn.net/weixin_44739914/article/details/115320707