c++模板实现栈

栈的管理可以用运链表,当然啦也可以用运数组,相比链表而数组管理起来更加方便,为什么呢???请睁大眼睛看下边博主大人的总结
数组管理栈的优点:
(1)插入删除方便,数组直接将++_top或者--_top即可,而链表还要删除节点置空指针,麻烦死啦;
(2)效率高呀,数组一次能够new T [_capacity]省事,而链表边用边new;
(3)其实这里还牵扯到一个cpu的高速缓存利用率

static and queue.h

#pragma  once

#include<iostream>

using namespace std;

template<class T>

class stack

{

public:

stack()

:_a(0)

,_top(0)

,_capacity(0)

{}

//刚开始写这个函数的时候很傻比,哎,下次一定铭记

stack(const stack <T>& s)

:_a(new T[s._capacity])

,_top(s._top)

,_capacity(s._capacity)

{

int i=0;

for(i=0;i<s._top;i++)

{

_a[i]=s._a[i];

}

}

stack<T>& operator=(const stack<T>& s)

{

if(this!=&s)

{

delete [] _a;

_a=new T [s._capacity*sizeof(T)];

int i=0;

for(i=0;i<_top;i++)

{

a[i]=s._a[i];

}

_top=s._top;

_capacity=s._capacity;

}

return *this;

}

~stack()

{

if(_a!=NULL)

{

delete [] _a;

_a=NULL;

}

}

//栈扩容函数

void _checkcapacity()

{

//不能用realloc开辟因为它不会调用构造和析构函数

if(_top==_capacity)

{

_capacity=_capacity*2+3;

T* tmp=new T [_capacity];

int i=0;

for(i=0;i<_top;i++)

{

tmp[i]=_a[i];

}

delete [] _a;

_a=tmp;

}

}

void push(const T& x);

void pop();

T& top();

bool empty();

size_t size();

void print();

protected:

T * _a;

size_t _top;

size_t _capacity;

};

static and queue.cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include"stack and queue.h"
#include<assert.h>
using namespace std;

template<class T>
void stack<T>::print()
{
	while(!empty())
	{
	cout<<_top<<" ";
	pop();
	}
	cout<<"over"<<endl;;
}

template<class T>
void stack<T>::push(const T& x)
{
   _checkcapacity();
   _a[_top++]=x;
}

template<class T>
void stack<T>::pop()
{
	if(_top>0)
	{
		--_top;
	}
}
template<class T>
T& stack<T>::top()
{
	if(!empty())
	{
	return _a[_top-1];
	}
}

template<class T>
bool stack<T>::empty()
{
	return (_top==0);
}

void TestStack()
{
   stack<int> s1;
   
   s1.push(1);
   s1.push(2);
   s1.push(3);
   s1.push(4);
 stack<int> s2(s1);
 stack<int> s3=s2;
   s1.print();
   s2.print();
   s3.print();
   /*cout<<s.top()<<endl;*/
}
int main()
{
	TestStack();
	system("pause");
	return 0;
}

时间: 2024-10-12 04:48:06

c++模板实现栈的相关文章

c++函数模板二栈实现

1 没有使用模板的栈实现 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 6 class Stack 7 { 8 public: 9 Stack(int size = 1024); 10 ~Stack(); 11 bool isEmpty(); 12 bool isFull(); 13 void push(int data); 14 int pop(); 15 private: 16 int*

数据结构:模板实现栈和队列

(一)模板实现栈 #pragma once typedef unsigned int size_t; template <class T> class Stack { public:  Stack()   :_array(NULL)   ,_top(-1)   ,_capacity(0)  {}  ~Stack()  {   if(_array)   {    delete[] _array;   }  } public:  void Push(const T& num)  {   _

c++数组类模板(栈内存)

#ifndef _ARRAY_H_ #define _ARRAY_H_ /* * 实现一个数组类模板,在栈上 * why * 2016/9/5 */ template < typename T, int N > class Array { private: T m_array[N]; public: int length(); //获取数组长度 bool set_array(T value, int index);  //设置数组元素内容 bool get_array(T& value

C++采用模板实现栈的方法

今天又看了遍<effective C++>,手动实现了一下条款42中的栈,贴出来当博客的处女贴. 首先栈的声明如下,采用了模板传入类型,而栈的底层采用是个链表. // stack.h // by Chwen 2014-10-27 #include<stdio.h> #include <stdlib.h> #include <iostream> using namespace std; // 栈声明 template<typename T> cla

链表模板、队列模板、顺序表模板、栈模板、

//利用容器适配器实现栈和队列 #pragma once #include<iostream> #include<string> #include<cassert> using namespace std; template<typename T> struct Node { public: Node(const T& d) :_next(NULL) , _prev(NULL)     ,_data(d){} T _data; Node<T&g

C++模板总结

本文参考了博文:C++ Template.C++模板详解.为什么C++编译器不能支持对模板的分离式编译. 在编写含有模板的程序的时候,我还是按照一个头文件声明,一个源文件的方法来组织,结果编译的时候总出现一些很奇怪的语法问题,但程序明明是没有问题的.后来经过查阅才知道原来是因为C++编译器不支持对模板的分离式编译,详细原因可参考博文为什么C++编译器不能支持对模板的分离式编译.所以,我在编写程序的时候,使用的是模板声明和实现放在同一个文件中的方法,即使用后缀为.hpp的文件(当然也可以是.h文件

C++里的模板

1.泛型编程 --即实现一个通用的标准容器库.所谓通用的标准容器库,就是要做到:比如List类存放所有肯恩类型的对象这样的事:泛型编程让你编写一个完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同.泛型即是指具有在多种数据类型上皆可操作的意思,与模板有些类似. --泛型编程的代表作品STL是一种高效.泛型.可交互操作的软件组件. 2.怎样编写一个通用的加法?? 1>使用函数重载,针对每个所需相同行为的不同类型重新实现它. 缺点:1>只要有新类型出现,就要重新添加对应函数.

C++中template的简单用法

模板(Template)指C++程序设计设计语言中采用类型作为参数的程序设计,支持通用程序设计.C++ 的标准库提供许多有用的函数大多结合了模板的观念,如STL以及IO Stream.使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数.返回值取得任意类型. 一.函数模板 在c++入门中,很多人会接触swap(int&, int&)这样的函数类似代码如下: 1 void swap(int&a , int& b) { 2 int temp

[转]C++ Template

引言 模板(Template)指C++程序设计设计语言中采用类型作为参数的程序设计,支持通用程序设计.C++ 的标准库提供许多有用的函数大多结合了模板的观念,如STL以及IO Stream. 函数模板 在c++入门中,很多人会接触swap(int&, int&)这样的函数类似代码如下: void swap(int&a , int& b) { int temp = a; a = b; b = temp;} 但是如果是要支持long,string,自定义class的swap函数