数据结构 之 链式栈 的实现
使用工具:VS2019
功能:
1、实现链式栈的基本功能
2、使用面向对象完成
软件下载:
目录
一、代码部分
头文件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.此时栈的大小为?
三、最终总结
实现了想要实现的功能。