程序员人生 网站导航

每日一题18:栈

栏目:php教程时间:2015-04-29 08:36:39

用C++写了1个栈模板,其间用了1些《Effective C++》的准则,记录在这里喽。这个类还没有做到异常安全,以后改进!
Stack.h文件。

#ifndef _STACK_H_ #define _STACK_H_ namespace MyDataStructure { template <typename T> class Stack { private: int Capacity; int Top; T* Vals; bool null() { return Capacity == 0; } void init(int capacity) { Capacity = capacity; Top = 0; Vals = new T[capacity]; } void copy(const Stack& s) { Capacity = s.Capacity; Top = s.Top; Vals = NULL; if(s.Capacity != 0) { Vals = new T[Capacity]; memcpy(Vals,s.Vals,Capacity*sizeof(T)); } } void destroy() { if(Vals != NULL) delete []Vals; Top = 0; Capacity = 0; } public: Stack() : Capacity(0),Top(0),Vals(NULL){}; Stack(int capacity) :Capacity(capacity),Top(0) { Vals = new T[capacity]; } Stack(const Stack& s) { copy(s); } Stack& operator = (const Stack& s) { if(this == &s) return *this; destroy(); copy(s); return *this; } ~Stack() { destroy(); } bool resize(int capacity) { if(capacity <= 0) return false; if(capacity == Capacity) return true; if(!null()) { T* vals = new T[capacity]; if(capacity >= Top) { memcpy(vals,Vals,Top*sizeof(T)); } else { memcpy(vals,Vals,capacity*sizeof(T)); Top = capacity; } Capacity = capacity; delete []Vals; Vals = vals; } else init(capacity); return true; } bool push(T val) { if(!full() && !null()) { Vals[Top++] = val; return true; } return false; } bool pop(T& val) { if(!null() && !empty()) { val = Vals[--Top]; return true; } return false; } bool top(T &val) { if(!null() && !empty()) { val = Vals[Top - 1]; return true; } return false; } void clear() { Top = 0; } void size() { return Top; } bool empty() { return Top == 0; } bool full() { return Top == Capacity; } }; } #endif

下面是测试函数:
StackTest.cpp

// StackTest.cpp : 定义控制台利用程序的入口点。 // #include "stdafx.h" #include "Stack.h" #include <iostream> using namespace MyDataStructure; using namespace std; int _tmain(int argc, _TCHAR* argv[]) { Stack<int> s1(10); for (int i = 1; i < 11; ++i) { s1.push(i); } Stack<int> s2(s1); s1.resize(20); for (int i = 1; i < 11; ++i) { int val; if(s1.pop(val)) { cout<<val<<' '; } } cout<<endl; for (int i = 1; i < 11; ++i) { int val; if(s2.pop(val)) { cout<<val<<' '; } } cout<<endl; return 0; }
------分隔线----------------------------
------分隔线----------------------------

最新技术推荐