堆棧(棧stack)的實現和基本用法(一)


個人網站http://www.ravedonut.com/

棧 (stack)又稱堆棧,是一種受限制的線性表,其限制是只允許在表的一端進行插入和刪除。

允許操作的一端稱為棧頂(top),不允許 操作的稱為棧底(bottom),每每次刪除的數據元素總是最后插入的數據元素,所以棧又稱為“后入先出表”。

棧的儲存結構有2種:一種順序儲存結構(順序棧),一種鏈式儲存結構(鏈式棧)。

今天主要來看看如何實現一個棧的功能

首先,棧的基本功能有:

1.       empty 判斷堆棧是否為空

2.       pop   向堆棧里面壓入一個數據

3.       push        向堆棧壓入一個數據

4.       size          返回當前堆棧長度(即內部數據個數)

5.       top           得到堆棧棧頂數據

實現:

1.利用之前的vector來實現:

stack1.h文件

#pragma once
#include <vector>
using namespace std;

template <class Object>
class Stack
{
public:
    Stack(void);
    bool isEmpty() const;
    const Object & top() const;
    void makeEmpty();
    void pop();
    void push(const Object & x);
    Object topAndPop();
    ~Stack();

private:
    vector<Object> theArray;
    int topOfStack;
};

stack1.cpp

#include "stack1.h"
//利用vector

template <class Object>
Stack<Object>::Stack():theArray(1)
{
    topOfStack=-1;
}


template <class Object>
bool Stack<Object>::isEmpty() const
{
    return topOfStack==-1;
}


template <class Object>
void Stack<Object>::makeEmpty()
{
    this->topOfStack=-1;
}


template <class Object>
void Stack<Object>::push(const Object & x)
{
    if(topOfStack==theArray.size()-1)
        theArray.resize(theArray.size()*21);
    theArray[++topOfStack]=x;
}


template <class Object>
const Object & Stack<Object>::top() const
{
    if(isEmpty())
        throw underflow_error( "堆棧已經為空" );
    return theArray[topOfStack];
}


template <class Object>
void Stack<Object>::pop()
{
    if(isEmpty())
        throw underflow_error( "堆棧已經為空" );
    topOfStack--;
}


template <class Object>
Object Stack<Object>::topAndPop()
{
    if(isEmpty())
        throw underflow_error( "堆棧已經為空" );
    return theArray[topOfStack--];
}


template <class Object>
Stack<Object>::~Stack()
{
}

2.利用數組實現:

stack2.h

#pragma once 
typedef int DataType; 
const int MaxStatckSize = 50; //棧大小  
class StackDemo 
{ 
private: 
    DataType stacklist[MaxStatckSize]; 
    int top;//棧頂 
public: 
    //構造函數 
    StackDemo(void); 
    ~StackDemo(void); 
public: 
    //壓棧出棧操作 
    void Push(const DataType &item); 
    DataType Pop(void); 
    void ClearStack(void); 

    //訪問棧頂 
    DataType Peek(void)const; 

    //檢測椎棧 
    bool isEmpty(void)const; 
    bool isFull(void)const; 
};

stack2.cpp

#include "stack2.h" 
#include <iostream> 

StackDemo::StackDemo(void) 
{ 
    this->top = -1; 
} 


StackDemo::~StackDemo(void) 
{ 
    this->top = -1; 
} 

void StackDemo::Push(const DataType &item) 
{ 
    //棧是否已滿 
    if(!isFull()) 
    {   top += 1; 
    this->stacklist[top] = item; 

    } 
    else 
        std::cout << "Out of the Stack!" << std::endl; 
} 

DataType StackDemo::Pop(void) 
{ 
    if(!isEmpty()) 
    {      
        int ebp = top; 
        top -= 1; 
        return stacklist[ebp]; 
    } 
    else 
        return -1; 
} 

DataType StackDemo::Peek(void)const
{ 
    return top; 
} 

void StackDemo::ClearStack() 
{ 
    for(int i = top;i >=0 ;i--) 
        stacklist[i] = 0; 
    top = -1; 
    std::cout << "Clear stack done!" << std::endl; 
} 

bool StackDemo::isFull(void)const
{ 
    return top > MaxStatckSize?true:false; 
} 

bool StackDemo::isEmpty(void)const
{ 
    return top < 0 ?true:false; 
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM