C++顺序栈实现

模板类文件位置:声明和定义均要在头文件中进行,否则会出现链接错误,不可只在头文件声明,在cpp文件中定义

环境VS2019

模板类中的友元函数声明:在类内声明友元函数时,需要在上面加上 模板头 template,否则会报错,具体原因网址

https://bbs.csdn.net/topics/120094418

构造函数中使用return;不影响结果,貌似是这样,在我这个例子

 

sequentialStack.h

#pragma once
#ifndef SEQUENTIALSTACK_H
#define SEQUENTIALSTACK_H

#include
#include
using std::cout;
using std::cin;
using std::endl;
using std::ostream;


template
class seqStack
{
public:
	seqStack(int numSize);
	~seqStack();
	void push(const T& elem);//进栈
	void pop(T& elem);//出栈
	bool empty();//查看栈是否为空
	int getSize();//返回栈中元素的个数
	void clearStack();//清空栈中的元素
	void print();//打印栈中的元素

	template
	friend ostream& operator<<(ostream& os, seqStack& s);//必需这样写否则报错

	

private:
	int maxsize;//栈最大的空间
	T *element;//存放栈中的元素的栈数组
	int top;//栈顶指针
};



template
seqStack::seqStack(int numSize) {
	maxsize = numSize;
	element = new T[maxsize];
	if (element == nullptr) {
		cout << "内存分配失败!";
		return;//用return无值不会报错,有值就会报错
	}
	top = -1;//保证top与数组元素同时移动
}

template
seqStack::~seqStack() {
	if (element != nullptr)
		delete[]element;
}

//进栈
template
void seqStack::push(const T& elem) {
	if (top < maxsize - 1)
		element[++top] = elem;
	else
		cout << "超过数组范围" << endl;
}

//出栈
template
void seqStack::pop(T& elem) {
	elem = element[top--];
	element[top + 1] = 0;//置零
}

//查看栈是否为空
template
bool seqStack::empty() {
	if (top == -1)
		return true;
	else
		return false;
}

//返回栈中元素的个数
template
int seqStack::getSize() {
	return top + 1;
}

//清空栈中的元素
template
void seqStack::clearStack() {
	while (!empty())
		element[top--] = 0;
}


template
ostream& operator<< (ostream& os, seqStack& s)
{
	os << "栈中元素个数为:" << s.getSize() << ".  " << endl;
	/*os << s.print();*///由于print()为void,这样写会报错
	return os;//注意该友元函数是有返回值的
}


//打印栈中的元素
template
void seqStack::print() {
	int index = 0;
	cout << "栈中元素为: ";
	while (index <= top)
		cout << element[index++] << " ";
	cout << endl;
}


#endif // !SEQUENTIALSTACK_H

main.cpp

#include"sequentialStack.h"

int main()
{
	seqStackstack(20);
	int val;
	for (int i = 0; i < 5; i++)
		stack.push(i);
	stack.print();
	cout << stack;
	while (!stack.empty())
	{
		stack.pop(val);
		cout << val << " ";
	}
	cout << endl;
}

 

你可能感兴趣的:(C++顺序栈实现)