C++实现栈

@这篇文档是由C++代码实现栈

栈就是先进后出的一种数据结构,这篇文档通过数组实现栈,要求是:栈是顺序的(即栈的长度初始化后给定了,如果栈中插入元素到了最后一个位置表示栈已满不能再插入新的元素),其次栈的插入类型没有定,所以建立的是模板类和函数模板,最后通过调用类模板在main()函数中实现。

本文是以Visual Studio中新建的C++win32的控制台应用程序实现的,其中建立了头文件和源文件以及实现main()的demo文件,分别是MyStack.h和MyStack.cpp和demo.cpp文件。

MyStack.h文件

#ifndef MYSTACK_H
#define MYSTACK_H

template <typename T>
class MyStack
{
public:
	MyStack(int length);
	virtual ~MyStack();
	int MyStackLen();
	bool MyStackEmpty();
	bool MyStackFull();
	void ClearMyStack();
	bool InsertElement(T element);
	bool DeleteElement(T &element);
	bool TraversalMyStack();
private:
	T* m_tMyStack;
	int m_iMyStackLength;
	int m_iMyStackCapacity;
	int m_iTos;
};

#endif

MyStack.cpp文件

#include "MyStack.h"
#include <iostream>
using namespace std;


template <typename T>
MyStack<T>::MyStack(int length)
{
	m_iMyStackCapacity = length;
	m_tMyStack = new T[m_iMyStackCapacity];
	ClearMyStack();
}


template <typename T>
MyStack<T>::~MyStack()
{
	delete []m_tMyStack;
	m_tMyStack = NULL;
}


template <typename T>
int MyStack<T>::MyStackLen()
{
	cout << "此时的队列长度为:" <<  m_iMyStackLength << endl;
	return 0;
}

template <typename T>
bool MyStack<T>::MyStackEmpty()
{
	return 0 == m_iTos?true:false;  //为什么要把0写到==前面?是因为防止将==写成=,如果写错了之后程序就会报错。
}


template <typename T>
bool MyStack<T>::MyStackFull()
{
	return m_iTos== m_iMyStackCapacity?true:false;
}

template <typename T>
void MyStack<T>::ClearMyStack()
{
	m_iMyStackLength = 0;
	m_iTos = 0;
	cout << "已经成功清除栈内的所有元素!" <<  m_iMyStackLength << endl;
}


template <typename T>
bool MyStack<T>::InsertElement(T element)
{
	if(MyStackFull())
	{
		cout << "该栈已满,不能再插入新的元素!" << endl;
		return false;
	}
	else
	{
		m_tMyStack[m_iTos] = element;
		m_iTos++;
		m_iMyStackLength++;
		cout << "已成功加入新的元素:" << element << endl;
		return true;
	}
}


template <typename T>
bool MyStack<T>::DeleteElement(T &element)
{
	if(MyStackEmpty())
	{
		cout << "该栈为空,不能再删除元素!" << endl;
		return false;
	}
	else
	{
		m_iTos--;
		element = m_tMyStack[m_iTos];
		m_iMyStackLength--;
		cout << "已成功删除元素:"  << element << endl;
		return true;
	}
}

template <typename T>
bool MyStack<T>::TraversalMyStack()
{
	if(MyStackEmpty())
	{
		cout << "该栈为空,不能遍历出任何元素!" << endl;
		return false;
	}
	else
	{
		cout << "现将栈内的元素一一打印如下:" << endl;
		for(int i=(m_iTos-1);i>=0; i--)
		{
			cout << m_tMyStack[i] << endl;
		}
		return true;
	}
}

demo.cpp文件(这个文件中实例化模板类一定要注意将MyStack.cpp文件包含进来,要不然会报错)

#include <iostream>
#include "MyStack.h"
#include "MyStack.cpp"
using namespace std;



int main(void)
{
	MyStack<double> stack(5);
	stack.InsertElement(10.1);
	stack.InsertElement(11.2);
	stack.InsertElement(12.3);
	stack.InsertElement(13.4);
	stack.InsertElement(14.5);
	stack.InsertElement(15.6);
	stack.TraversalMyStack();

	double e =0.1;

	stack.DeleteElement(e);
	cout << endl;
	stack.TraversalMyStack();
	cout << endl;
	stack.MyStackLen();
	stack.TraversalMyStack();

	cout << endl;
	stack.ClearMyStack();
	stack.TraversalMyStack();

	system("pause");
	return 0;
}
栈的实现和队列的实现不一样的地方就是栈只需要一个指针m_iTos来记录栈中元素的位置,所以无论是插入元素还是删除元素,都相对来说简单一些,只是在 标记元素的时候需要注意++和–的先后顺序。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值