1. 程式人生 > >棧和佇列的實現

棧和佇列的實現

#include <iostream>
#include <assert.h>
using namespace std;
//Stack  implementation

template<class T>
class Stack
{
public:
	Stack()
		:a(NULL)
		,_top(0)
		,capacity(0)
	{}
	
	~Stack()
	{
		if(a!=NULL)
		{
			delete[] a;
		}
	}

	Stack(const Stack<T>& s)
		:a(s.a)
		,capacity(s._top)
		,_top(s._top)
	{
		s.a=NULL;
	}
	
	Stack<T>& operator=(const Stack<T>& s)
	{
		if(this!=&s)
		{
			swap(a,s.a);
			capacity=s.capacity;
			_top=s._top;
		}
		return *this;
	}
	
	void Push(const T& d)
	{
		_CheckCapacity();
		a[_top++] = d;
	}

	void Pop()  
	{
		if(_top!=0)
		{
			_top--;
		}
	}

	T& top()
	{
		return a[_top-1];
	}

	bool Empty()
	{
		if(_top==0)
			return true;
	}

	size_t Size()
	{
		return _top;
	}

	
protected:
	void _CheckCapacity()  
	{
		int i;
		if(_top==capacity)
		{
			capacity=2*capacity+3;
			T* tmp=new T[capacity];
			for(i=0;i<(_top);i++)
			{
				tmp[i]=a[i];
			}
			delete[] a;
			a=tmp;
		}
	}
private:
	T* a;
	size_t _top;
	size_t capacity;
};

//Queue  implementation
template<class T>
struct Node
{
	Node(const T&d)
		:_data(d)
		,next(NULL)
	{
	}
	T _data;
	Node<T> *next;
};

template<class T>
class Queue
{
public:
	Queue()
		:_head(NULL)
		,_tail(NULL)
		,m(0)
	{ }
	
	~Queue()
	{
		if(_head!=NULL)
		{
			Node<T> *cur=_head;
			Node<T> *del=NULL;
			while(cur)
			{
				del=cur;
				cur=cur->next;
				delete del;
				del=NULL;
				
			}
		}
	}
	void Push(const T& x)
	{
		Node<T>* NewNode=new Node<T>(x);
		if(_head==NULL)
		{
			_head=_tail=NewNode;
			
		}
		else
		{
			NewNode->next=_head;
			_head=NewNode;
		}
		m++;
	}

	void Pop()
	{
		Node<T> *del=NULL;
		if(_head==NULL)
		{
			return;
		}
		else if(_head==_tail)
		{
			delete _head;
			_head=NULL;
		}
		else
		{
			del=_head;
			_head=_head->next;
			delete del;
			del=NULL;
		}
		m--;
	}

	T& Front()
	{
		assert(_head);
		return _head->_data;
	}

	T& Back()
	{
		assert(_head);
		return _tail->_data;
	}

	bool Empty()
	{
		if(_head==NULL)
			return true;
	}

	size_t Size()
	{
		assert(_head);
		return m;
	}

protected:
	Node<T>* _head;
	Node<T>* _tail;
	size_t m;
};


相關推薦

python 用佇列實現二叉樹的深度優先遍歷(三種)廣度優先遍歷

#coding=utf-8 #自定義佇列 class pyqueue(): def __init__(self, size): self.queue = [] self.size = size self.end =

基於佇列實現二叉樹的遍歷

一般我們遍歷二叉樹的時候用的是遞迴,用遞迴實現比較簡單,程式碼如下: C/C++ code ? 1 2 3 4 5 6 7 8 9 10 11 12 13

佇列實現迴文判斷

#include<stdio.h> #include<stdlib.h> struct node; typedef struct node *pnode; struct node {     char info;     pnode link; };

js 實現佇列

js實現棧或者佇列有兩種方式: 1.陣列:陣列本身提供棧方法(push,pop),佇列方法(push,shift)。 程式碼實現(棧): /*=======棧結構=======*/ var stack=function(){ this.data=[] this.push=push

向量、連結串列、佇列的基本實現

目錄 一、一點感想 二、程式碼 1、Vector 2、 List 3、Stack 4、Queue 三、不足之處 一、一點感想 自學資料結構和演算法到現在時間也不短了,一直猶豫著要不要寫一寫向量等幾個最最基本的資料結構,因為總覺得是最基本的,

C語言實現佇列(佇列的基本操作)

棧: 棧:棧(stack)又名堆疊,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。 特點:先進後出 stack.h #pragma once #include <stdio.h> #include <

佇列的基本操作的實現

1. 實驗目的 熟練掌握棧和佇列的抽象資料型別,能在相應的應用問題中正確選用它們,熟練掌握棧和佇列的實現方法(順序和鏈式),兩種儲存結構和基本操作的實現演算法,注意空和滿的判斷條件及它們的描述方法,掌握迴圈佇列與其它順序結構實現上的不同及解決辦法,熟悉各種佇列的基本操作在迴圈佇列上的實現

python列表練習-用python實現佇列

1.棧的工作原理:先進後出 入棧 出棧 棧頂元素 棧的長度 棧是否為空 stack = [] info = """ 棧操作 1.入棧 2.出棧 3.棧頂元素 4.棧的長度 5.棧是否為空 """ while True:

佇列的結構實現

棧 棧(stack),有些地方稱為堆疊,是一種容器,可存入資料元素、訪問元素、刪除元素,它的特點在於只能允許在容器的一端(稱為棧頂端指標,英語:top)進行加入資料(英語:push)和輸出資料(英語:pop)的運算。沒有了位置概念,保證任何時候可以訪問、刪除的元素都是此前最後存入的那個元素,確定

資料結構---佇列(結構體實現

棧(LIFO) 棧(stack)是一種只能在一端進行插入或刪除操作的線性表。 棧頂(top):允許進行插入、刪除操作的一端 棧底(bottom):另一端稱為棧底 進棧或入棧(push):插入操作 出棧或退棧(pop):棧的刪除操作 n個不同元素通過一個棧產生的出棧

佇列的基本操作實現及其應用

實驗2:棧和佇列的基本操作實現及其應用 一、實驗目的 1、   熟練掌棧和佇列的結構特點,掌握棧和佇列的順序儲存和鏈式儲存結構和實現。 2、      學會使用棧和佇列解決實際問題。 二、實驗內容 1

Java實現佇列

棧:LIFO(後進先出) 佇列:FIFO(先進先出) 棧的順序儲存結構實現: /** * 基於陣列實現的順序棧 * @param <E> */ public class Stack<E> { private Object[]

C++實現佇列(Linux環境)

Stack.h #pragma once #include<iostream> using namespace std; #include<assert.h> //靜態棧 te

實現佇列佇列實現

1、棧實現佇列 棧結構:先進後出(FILO); 佇列結構:先進先出(FIFO); 所以想要用棧實現佇列的效果,自然而然地就想到兩個棧實現一個佇列; 程式碼如下: 兩個棧,一個入隊,一個出隊 public class QueueOfStack {

【死磕演算法·佇列】僅用遞迴實現的逆序

題目要求:實現棧的逆序,但只能用遞迴函式和這個棧本身操作來實現,不能自己申請額外的資料結構。 題目思路: 實現兩個遞迴函式: getBottomItem():移除棧底元素並返回該元素 reverse():實現整個棧逆序   如何寫遞迴函式? 遞迴函式在函式體中

佇列面試題(一)---一個數組實現兩個

一,用一個數組實現兩個棧(先進後出),有以下幾種方法: ①陣列的奇數位置儲存一個棧的元素,偶數位置儲存另一個棧的元素; ②兩個棧分別從陣列的中間向兩頭增長; 陣列的中間位置看做兩個棧的棧底,壓棧時棧頂指標分別向兩邊移動,當任何一邊到達陣列的起始位置或是陣

1. 佇列的陣列實現

用陣列實現一個棧 棧頂元素下標index與其對應的陣列元素下標f(index)之間的對映關係是怎樣的?隨著棧的增長,棧頂元素下標依次為0,1,2...n-1,其中n表示棧的最大高度。我們需要制定一種對映規則f,方便我們通過index計算出f(index)。而最簡單的規則就是f(index) = inde

佇列的基本操作實現

《資料結構》(c語言版)——第三章、棧和佇列 抽象資料型別——棧 順序儲存結構: #include<stdio.h> #include<stdlib.h> #include<string.h> #define ok 1 #defin

《劍指Offer》佇列--用兩個實現佇列

時間限制:1秒 空間限制:32768K 熱度指數:317529 本題知識點: 佇列 棧 題目描述 用兩個棧來實現一個佇列,完成佇列的Push和Pop操作。 佇列中的元素為int型別。 思路: 首先需要清楚的是,棧的特點是:先進後出;佇列

java中佇列實現API用法

在java中要實現棧和佇列,需要用到java集合的相關知識,特別是Stack、LinkedList等相關集合型別。 一、棧的實現 棧的實現,有兩個方法:一個是用java本身的集合型別Stack型別;另一個是借用LinkedList來間接實現Stack。 1.Stack實現