您的位置:首页 > 编程语言 > C语言/C++

用c++封装的一个栈

2018-03-02 16:41 239 查看

stack.h

#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED
/* --- 链栈 --- */
template <class T>
struct Node{ // 定义结构体
T data;  // 数据
struct Node *next; // 下一个节点
};

// 类模板
template <class T>
class Stack{  // 类定义
public:
// 默认构造器(定义变量的时候会执行)
Stack<T>(){
head = new Node<T>;
head->next = NULL;
}
~Stack<T>(){
Destory();
}
bool push(T data);  // 入栈
T pop();            // 出栈
void Destory();     // 销毁
void Clear();       // 清空栈
bool isEmpty();     // 是否为空
private:
Node<T> *head;      // 头节点
};

template <class T>
bool Stack<T>::push(T data){
Node<T> *newPt = new Node<T>; // 为新数据申请空间
// 若申请失败 返回false
if(!newPt)
return false;
// 为新节点存入数据
newPt->data = data;
// 连接头节点(链表的头插法)
newPt->next = head->next;
head->next = newPt;
return true;
}

template <class T>
T Stack<T>::pop(){
T data;  // 要弹出的数据
Node<T> *pf; // 要销毁的指针
pf = head->next; // 取第一个数据
if(!pf)  // 如若第一个数据为空 则表示栈为空
return 0;
data = pf->data; // 取第一个数据保存进临时变量
head->next = head->next->next; // 节点后移
delete pf; // 删除节点
return data;
}

template <class T>
bool Stack<T>::isEmpty(){
if(head->next)  // 取第一个节点,不为空表示有数据
return true;
return false;
}

template <class T>
void Stack<T>::Clear(){
while(isEmpty()){  // 依次把数据弹出,则变相清空了栈
pop();
}
}

template <class T>
void Stack<T>::Destory(){
Clear();     // 清空所有数据
delete head; // 销毁头节点
}

#endif // STACK_H_INCLUDED


TestStack.cpp

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

int main(){
Stack<int> s;
// Stack<char> s1;
// Stack<string> s2;
// Stack<double> s3;
// Stack<char> sTemp;

// s.push("A");
// cout << s.pop() << " ";

for(int i = 0; i < 8; ++i){
s.push(i);
// sTemp.push(i+32);
}

// cout << s.isEmpty() << endl;

for(int i = 0; i < 8; ++i){
cout << s.pop() << " ";
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  stack c语言