数据结构学习第十三课(C++实现栈)

头文件
#pragma once
#pragma once

#include<iostream>
using std::cout;
using std::endl;
template<class T>
class MyStack
{
public:
	MyStack();
	~MyStack();
	//入栈
	void push(const T& data);
	void travel()const;
	//获取栈顶元素
	T getTop()const;
	//出栈
	void pop();
	//判栈是否为空
	bool isEmpty()const;
private:
	T* pArr;
	size_t len;//当前元素个数 size
	size_t maxLen;//当前容量capacity

};

template<class T>
inline MyStack<T>::MyStack()
{
	pArr = NULL;
	len = maxLen = 0;
}

template<class T>
inline MyStack<T>::~MyStack()
{
	if (pArr)
	{
		delete[] pArr;
	}
	pArr = NULL;
	len = maxLen = 0;
}

template<class T>
inline void MyStack<T>::push(const T& data)
{
	//判断是否需要申请内存
	if (len >= maxLen)//需要
	{
		//计算需要申请多大的内存
		maxLen = maxLen + (((maxLen >> 1) > 1) ? (maxLen / 2) : 1);
		//1,申请内存
		//int* pNew = (int*)malloc(sizeof(int) * maxLen);
		T* pNew = new T[maxLen];
		if (NULL != pArr)
		{
			//之前有数据
			//原来的数据拷贝过来
			memcpy(pNew, pArr, sizeof(T) * len);
			//释放原来内存
			delete[] pArr;
		}
		//pArr指向新开内存
		pArr = pNew;
	}
	//2,数据进来
	//3,len自增
	pArr[len++] = data;
}

template<class T>
inline void MyStack<T>::travel() const
{
	cout << "__" << ":";
	for (size_t i = 0; i < len; i++)
	{
		cout << pArr[i] << " ";
	}
}

template<class T>
inline T MyStack<T>::getTop() const
{
	return pArr[len - 1];
}

template<class T>
inline void MyStack<T>::pop()
{
	if (len > 0)
	{
		len--;
	}
}

template<class T>
inline bool MyStack<T>::isEmpty() const
{
	return len==0;
}
源文件
#include<stdio.h>
#include"MyStack.h"
#include<iostream>
using namespace std;
class FenShu
{
public:
	FenShu():fenzi(0),fenmu(0) {}
	FenShu(int fz, int fm = 4)
	{
		fenzi = fz;
		fenmu = fm;
	}
	friend ostream& operator<<(ostream& o, const
		FenShu& fs);

private:
	int fenzi;
	int fenmu;
};
int main()
{
	MyStack<int> vInt;
	MyStack <FenShu> vFs;
	for (int i = 0; i < 10; i++)
	{
		vInt.push(i);
		vFs.push(FenShu(i));
	}
	while (!vInt.isEmpty())
	{
		cout << vInt.getTop() << " ";
		vInt.pop();
	}
	while (!vFs.isEmpty())
	{
		cout << vFs.getTop() << " ";
		vFs.pop();
	}
	return 0;
}

ostream& operator<<(ostream& o, const FenShu& fs)
{
	return o << "(" << fs.fenzi << "/" << fs.fenmu << ")";
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值