算法與數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)5:C++棧的簡(jiǎn)單實(shí)現(xiàn)
來(lái)源:程序員人生 發(fā)布時(shí)間:2014-12-25 08:32:49 閱讀次數(shù):2758次
堆棧是基于隊(duì)列的,只需要要略微改1下就ok了,把代碼貼在下面
// Stack.h
#include <cstdio>
#include <cassert>
#include <iostream>
using namespace std;
class Stack
{
public:
// **************************************************************************
// 類的4大函數(shù):構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)、重載賦值運(yùn)算符、析構(gòu)函數(shù)
// **************************************************************************
Stack();
Stack(const Stack &Stack);
Stack& operator=(const Stack &Stack);
~Stack();
// **************************************************************************
// 增刪改查
// **************************************************************************
void Push(const int& data);
int Pop();
unsigned short Size();
bool IsEmpty();
void PrintStack();
private:
void Free();
private:
typedef struct Node{
Node(int d):data(d),next(NULL){}
int data;
struct Node* next;
}Node;
Node* m_head;
Node* m_tail;
unsigned short m_size;
};
// **************************************************************************
// 私有方法
// **************************************************************************
void Stack::Free()
{
if(m_head){
Node* tmp = NULL;
while(m_head){
tmp = m_head;
m_head = m_head->next;
delete tmp;
}
}
m_head = NULL;
m_tail = NULL;
m_size = 0;
}
// **************************************************************************
// 類的4大函數(shù):構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)、重載賦值運(yùn)算符、析構(gòu)函數(shù)
// **************************************************************************
Stack::Stack()
{
m_head = NULL;
m_tail = NULL;
m_size = 0;
}
Stack::Stack(const Stack &Stack)
{
m_head = NULL;
m_tail = NULL;
m_size = Stack.m_size;
if(Stack.m_head){
Node* tmp = Stack.m_head;
Node* q = NULL;
while(tmp){
Node* node = new Node(tmp->data);
if(!m_head){
m_head = node;
q = m_head;
}
else{
q->next = node;
q = node;
}
tmp = tmp->next;
}
m_tail = q;
}
else{
m_head = NULL;
m_tail = NULL;
}
}
Stack& Stack::operator=(const Stack &Stack)
{
Free();
m_size = Stack.m_size;
if(Stack.m_head){
Node* tmp = Stack.m_head;
Node* q = NULL;
while(tmp){
Node* node = new Node(tmp->data);
if(!m_head){
m_head = node;
q = m_head;
}
else{
q->next = node;
q = node;
}
tmp = tmp->next;
}
m_tail = q;
}
else{
m_head = NULL;
m_tail = NULL;
}
return *this;
}
Stack::~Stack()
{
if (m_head){
Node* tmp = m_head;
while (tmp){
m_head = m_head->next;
delete tmp;
tmp = m_head;
}
}
m_head = NULL;
m_tail = NULL;
}
// **************************************************************************
// 增刪改查
// **************************************************************************
void Stack::Push(const int& data)
{
Node* tmp = new Node(data);
if (!m_head) {
m_head = tmp;
m_tail = tmp;
}
else{
tmp->next = m_head;
m_head = tmp;
}
++m_size;
}
int Stack::Pop()
{
assert(m_size > 0);
Node* tmp = m_head;
m_head = m_head->next;
int val = tmp->data;
delete tmp;
--m_size;
return val;
}
unsigned short Stack::Size()
{
return m_size;
}
bool Stack::IsEmpty()
{
return (m_size == 0);
}
void Stack::PrintStack()
{
cout << "size : " << m_size << " , content : ";
if (m_head){
Node* tmp = m_head;
while (tmp){
cout << tmp->data << " -> ";
tmp = tmp->next;
}
}
cout << "NULL" << endl;
}
// main.cpp
// test for Stack
#include "Stack.h"
#include <cstdlib>
#include <iostream>
#include <list>
using namespace std;
int main()
{
Stack stack;
for (int i = 1; i < 5; ++i){
stack.Push(i);
}
stack.PrintStack();
Stack stackCopy(stack);
stackCopy.PrintStack();
Stack stackAssig;
stackAssig = stack;
stackAssig.PrintStack();
int pop = stack.Pop();
cout << "pop:" << pop << endl;
stack.PrintStack();
system("pause");
return 0;
}
// 輸出截圖

生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)