011 模板栈和队列

Posted huafan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了011 模板栈和队列相关的知识,希望对你有一定的参考价值。

 

 

/*
目录:
一: 栈模板
    1 类内编写
    2 类外编写 
二: 队列
    1 类内编写
    2 类外编写
*/    

 

一: 栈模板
  1 类内编写

// Stack.h
#pragma once
#include <iostream>

template<typename DATA>
class CStack

public:
    CStack() :m_nTop(-1)
    

    
    bool isFull()
    
        if (m_nTop + 1 >= COUNT)
        
            return true;
        
        return false;
    

    bool isEmpty()
    
        if (-1 == m_nTop)
        
            return true;
        
        return false;
    

    bool push(const DATA &data)
    
        if (true != isFull())
        
            ++m_nTop;
            m_data[m_nTop] = data;
            return true;
        

        return false;
    

    bool pop(DATA &data)
    
        if (true != isEmpty())
        
            data = m_data[m_nTop];
            --m_nTop;
            return true;
        

        return false;
    

private:
    
    enum COUNT = 5;
    DATA m_data[COUNT];
    int m_nTop;
;

 

#include "stdafx.h"
#include "Stack.h"

using namespace std;


int main(int argc, char *argv[], char **envp)

    CStack<int> st;
    
    int nLoop = 0;
    while (nLoop < 10)
    
        st.push(nLoop + 1);
        ++nLoop;
    

    
    nLoop = 0;
    while (nLoop < 10)
    
        int data;
        if (true == st.pop(data))
        
            cout << data << endl;
        

        ++nLoop;
    
    return 0;

 


  2 类外编写

// Stack.h
#pragma once
#include <iostream>


template<typename DATA>
class CStack

public:
    CStack(int nCount = 10);

    bool isFull();
    bool isEmpty();

    bool push(const DATA &data);
    bool pop(DATA &data);

private:
    DATA *m_pData;
    int m_nCount;
    int m_nTop;
;


template<typename DATA>
CStack<DATA>::CStack(int nCount): m_nTop(-1)

    m_pData = new DATA[nCount];
    m_nCount = nCount;


template<typename DATA>
bool CStack<DATA>::isFull()

    if (m_nTop + 1 >= m_nCount)
    
        return true;
    
    return false;


template<typename DATA>
bool CStack<DATA>::isEmpty()

    if (-1 == m_nTop)
    
        return true;
    
    return false;



template<typename DATA>
bool CStack<DATA>::push(const DATA &data)

    if (true != isFull())
    
        ++m_nTop;
        m_pData[m_nTop] = data;
        return true;
    

    return false;


template<typename DATA>
bool CStack<DATA>::pop(DATA &data)

    if (true != isEmpty())
    
        data = m_pData[m_nTop];
        --m_nTop;
        return true;
    

    return false;

 


二: 队列
  1 类内编写

#pragma once
typedef int DATA;

class CQueue

public:
    CQueue(int nCount = 6)
    
        m_pData = new DATA[nCount];
        m_nHead = m_nTail = 0;
        m_nCount = nCount;
    
    ~CQueue()
    
        delete[] m_pData;
    

    bool isFull()
    
        if (m_nHead == (m_nTail + 1) % m_nCount)
        
            return true;
        
        return false;
    

    bool isEmpty()
    
        if (m_nTail == m_nHead)
        
            return true;
        
        return false;
    

    bool push(const DATA &data)
    
        if (true == isFull())
        
            return false;
        

        m_pData[m_nTail] = data;
        m_nTail = ++m_nTail % m_nCount;
        return true;
    

    bool pop(DATA &data)
    
        if (true == isEmpty())
        
            return false;
        

        data = m_pData[m_nHead];
        m_nHead = ++m_nHead % m_nCount;
        return true;
    

private:
    DATA *m_pData;
    int m_nCount;
    int m_nHead, m_nTail;
;

 

#include "stdafx.h"
#include "Queue.h"
#include <iostream>

using namespace std;


int main(int argc, char *argv[], char **envp)

    CQueue q;

    int nLoop = 0;
    while (nLoop < 10)
    
        q.push(nLoop);
        ++nLoop;
    

    int d;
    q.pop(d);
    cout << d << endl;
    q.pop(d);
    cout << d << endl;

    nLoop = 0;
    while (nLoop < 5)
    
        q.push(nLoop + 1);
        ++nLoop;
    

    while (true == q.pop(d))
    
        cout << d << endl;
    

    return 0;

 

 

  2 类外编写

 

#pragma once

template<typename DATA>

class CQueue

public:
    CQueue(int nCount = 6);
    ~CQueue();

    bool isFull();
    bool isEmpty();

    bool push(const DATA &data);
    bool pop(DATA &data);

private:
    DATA *m_pData;
    int m_nCount;
    int m_nHead, m_nTail;
;

template<typename DATA>
CQueue<DATA>::CQueue(int nCount)

    m_pData = new DATA[nCount];
    m_nHead = m_nTail = 0;
    m_nCount = nCount;


template<typename DATA>
CQueue<DATA>::~CQueue()

    delete[] m_pData;


template<typename DATA>
bool CQueue<DATA>::isFull()

    if (m_nHead == (m_nTail + 1) % m_nCount)
    
        return true;
    
    return false;


template<typename DATA>
bool CQueue<DATA>::isEmpty()

    if (m_nTail == m_nHead)
    
        return true;
    
    return false;


template<typename DATA>
bool CQueue<DATA>::push(const DATA &data)

    if (true == isFull())
    
        return false;
    

    m_pData[m_nTail] = data;
    m_nTail = ++m_nTail % m_nCount;
    return true;


template<typename DATA>
bool CQueue<DATA>::pop(DATA &data)

    if (true == isEmpty())
    
        return false;
    

    data = m_pData[m_nHead];
    m_nHead = ++m_nHead % m_nCount;
    return true;

 

以上是关于011 模板栈和队列的主要内容,如果未能解决你的问题,请参考以下文章

栈和队列

队列

队列

顺序栈

顺序栈

stl栈和队列的内部实现