定义一个堆栈类模板,实现数据类型数据的入栈和出栈操作,堆栈的大小用非类型参数指定。
- 能实现数据的入栈、出栈、返回栈顶元素、判空、判满功能
- 能实现显示栈内成员
#include<iostream>
using namespace std;
// 定义Stack类
template<class T, int MaxSize>
class Stack {
public:
Stack() {
elems = new T[MaxSize];
top = -1;
}
~Stack() { delete elems; }
bool IsEmpty(Stack &stack1)const{
if (stack1.top == 1)
{
return true;
}
return false;
}
bool IsFull(Stack& stack1)const{
if (stack1.top == MaxSize - 1)
{
return true;
}
return false;
}
T Top_Data(Stack &stack1)const;
Stack<T, MaxSize>& Push(const T& x,Stack &stack1);
Stack<T, MaxSize>& Pop(T& x, Stack& stack1);
void Display(Stack &stack1)const;
private:
int top; //栈顶指针
T* elems; //创建空栈
};
// 返回Stack首元素
template<class T, int MaxSize>
T Stack<T, MaxSize>::Top_Data(Stack& stack1)const {
if (IsEmpty(stack1))
throw out_of_range("该栈为空栈,无法返回栈顶元素");
return elems[top];
}
// 进行Push操作
template<class T, int MaxSize>
Stack<T, MaxSize>& Stack<T, MaxSize>::Push(const T& x, Stack& stack1) {
if (IsFull(stack1))
throw out_of_range("该栈已满,无法插入新的数据!");
elems[++stack1.top] = x;
return stack1;
}
// 进行Pop操作
template<class T, int MaxSize>
Stack<T, MaxSize>& Stack<T, MaxSize>::Pop(T& x, Stack& stack1) {
if (IsEmpty(stack1))
throw out_of_range("该栈为空,无法出栈!");
x = elems[stack1.top--];
return stack1;
}
// 显示Stack内所有元素,从栈底到栈顶依次显示
template<class T, int MaxSize>
void Stack<T, MaxSize>::Display(Stack& stack1)const {
if (IsEmpty(stack1))
cout << "None" << endl;
else {
for (int i = 0; i <= top; i++)
cout << elems[i] << " ";
}
}
int main() {
try {
//初始化栈
Stack<int, 10> stack;
//入栈
for (int i = 0; i < 10; i++)
{
stack.Push(5 * i,stack);
}
//显示栈内数据
stack.Display(stack);
cout << endl;
//出栈
for (int i = 0; i < 2; i++) {
int x;
stack.Pop(x,stack);
cout <<"任意删除的数据:"<< x <<endl;
}
cout << endl;
stack.Display(stack);
//返回栈顶元素
cout << endl;
cout << "删除后,栈顶元素为:" << stack.Top_Data(stack) << endl;
return 0;
}
catch (exception& e) {
cout << e.what() << endl;
}
}