LinkStack.h
#pragma once
#ifndef LINKSTACK_H
#define LINKSTACK_H
#include<iostream>
#include<ostream>
using std::cout;
using std::cin;
using std::endl;
using std::ostream;
template<class T> class linkStack;
template<typename T>
class Node
{
public:
Node(Node*ptr=nullptr):next(ptr){}
T data;//栈的数据
Node<T>* next;
};
template<typename T>
class linkStack
{
public:
linkStack();
~linkStack();
void push(const T& elem);//进栈
void pop(T& elem);//出栈
bool empty();//查看栈是否为空
int getSize();//返回栈中元素的个数
void clearStack();//清空栈中的元素
void print();//打印栈中的元素
bool getTop(T &elem);//读取栈顶元素
template<typename T>
friend ostream& operator<<(ostream& os, linkStack<T>& l);
private:
Node<T> *top;//定义栈顶指针
};
template<typename T>
linkStack<T>::linkStack(){
Node<T>* p = (Node<T>*)new Node<T>[1];
top = p;
top->next = nullptr;
}
template<typename T>
linkStack<T>::~linkStack(){
Node<T>* p = top;
Node<T>* q = nullptr;
while (p->next!=nullptr){
q = p;
p = p->next;
delete q;
}
if (q == nullptr)
delete q;
delete p;
}
//进栈
template<typename T>
void linkStack<T>::push(const T& elem){
Node<T>* p = (Node<T>*)new Node<T>[1];
p->data = elem;
Node<T>* q;
if (!empty()){
q = top->next;
top->next = p;
p->next = q;
}
else
top->next = p;
}
//出栈
template<typename T>
void linkStack<T>::pop(T& elem){
if (!empty()){
Node<T>* p = top->next;
elem = p->data;
top->next = p->next;
//cout <<"移除元素为:"<<elem<<" 剩余元素个数:"<< getSize() << endl;
delete p;
}
else
cout << "栈已空!" << endl;
}
//查看栈是否为空
template<typename T>
bool linkStack<T>::empty(){
if (top->next != nullptr)
return false;
return true;
}
//返回栈中元素的个数
template<typename T>
int linkStack<T>::getSize(){
int Index = 0;
Node<T>* p = top->next;
while (p) {//当p节点不为零时
p = p->next;
++Index;
}
return Index;
}
//清空栈中的元素
template<typename T>
void linkStack<T>::clearStack(){
if (!empty()){
Node<T>* p = top->next;
Node<T>* q;
while (p){
q = p;
p = p->next;
delete q;
}
if (q == nullptr)
delete q;
delete p;
}
top->next = nullptr;
}
//打印栈中的元素
template<typename T>
void linkStack<T>::print(){
Node<T>* p = top->next;
while (p){
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
//读取栈顶元素
template<typename T>
bool linkStack<T>::getTop(T&elem){
Node<T>* p = top->next;
if (p) {
elem = p->data;
return true;
}
else {
cout << "栈为空" << endl;
return false;
}
}
template<typename T>
ostream& operator<<(ostream& os, linkStack<T>& l) {
os << "栈中元素个数为:" << l.getSize() << endl;
Node<T>* p = l.top->next;
for (int i = 0; i < l.getSize(); i++){
os << p->data << " ";
p = p->next;
}
os << endl;
return os;
}
#endif // !LINKSTACK_H
main.cpp
#include"LinkStack.h"
int main()
{
linkStack<int> ls;
int a = 0;
int b = 0;
for (int i = 0; i < 10; i++)
{
ls.push(i);
}
ls.print();
cout << ls.getTop(b) << " " << b << endl;
for (int i = 0; ls.empty()==0; i++)
{
ls.pop(a);
cout << a << " ";
cout << " 循环次数为:" << i + 1 << endl;
}
cout << endl;
cout << ls;
}