栈机制--模拟实现原理

栈机制--模拟实现原理

知识点简要介绍:
    栈:限定在表头进行插入和删除操作的线性表,引申为仓库
一种数据结构,只能在一端进行插入和删除操作,后进先出(LIFO)原则存储数据,push入栈,pop出栈

允许插入和删除的一段为栈顶(低地址的一端),另一端为栈底


队列一样没有数据类型的界限


算法:
push入栈:
    1.TOP++;
    2.若Top >= n,溢出
    3.pStack[Top] = x;入栈
pop出栈:
    1.若Top <= 0;向下溢出
    2.x = pStack[Top];
    3.Top--;
    
模拟开始:
//--------------------------------------

//--int型栈机制实现---------------------


MyStack.h
<span style="font-size:14px;">#ifndef MYSTACK_H
#define MYSTACK_H
//---------------
class MyStack{
public:
    MyStack(int size);//初始化栈空间,设定容量
    ~MyStack();          //回收空间
    bool stackEmpty() const;//判空
    bool stackFull() const;//判满
    void clearStack();//清空
    int stackLength() const;//栈中元素个数
    bool push(char element);//入栈
    bool pop(char& element);//出栈
    void stackTraverse();//遍历
    
private:
    char* m_pStack;//栈空间指针
    int m_iSize;//容量
    int m_iTop;//个数
};

#endif MYSTACK_H</span>


MyStack.cpp
<span style="font-size:14px;">#include"MyStack.h"
#include<iostream>
using namespace std;
//-------------------------
 
MyStack::MyStack(int size){
    m_iSize = size;
    m_pStack = new char[m_iSize];
    m_iTop = 0;
}
MyStack::~MyStack(){
    delete []m_pStack;
}
bool MyStack::stackEmpty() const{
    if(0 == m_iTop)
        return true;
    else return false;
}
bool MyStack::stackFull() const{
    if(m_iTop == m_iSize)
        return true;
    else return false;
}
void MyStack::clearStack(){
    m_iTop = 0;
}
int MyStack::stackLength() const{
    return m_iTop;
}

bool MyStack::push(char element){
    if(stackFull()){
        return false;    
    }
    else{
        m_pStack[m_iTop] = element;
        m_iTop++;
        return true;
    }
}
bool MyStack::pop(char& element){
    if(stackEmpty()){
        return false;
    }
    m_iTop--;
    element = m_pStack[m_iTop];
    return true;
}
void MyStack::stackTraverse(){
    for(int i = m_iTop-1; i >= 0; i--){
        cout << m_pStack[i] ;//从栈顶到栈底遍历
    }
    cout << endl;
}</span>


demo.cpp
<span style="font-size:14px;">#include<iostream>
#include"MyStack.h"
using namespace std;
//------------------
int main(){
    MyStack *p = new MyStack(8);
    
    if(p->stackEmpty()){cout << "栈为空!" << endl;}    
    cout << "\n值压入栈中:" << endl;
    
    p->push('!');//栈底
    p->push('t');
    p->push('n');
    p->push('e');
    p->push('d');
    p->push('u');
    p->push('t');
    p->push('s');//栈顶
    
    p->stackTraverse();//遍历
    
    cout << "\n栈顶元素:" << endl;
    char e ='0';
    p->pop(e);
    cout << e << endl << endl;;
    cout << "清空:" << endl;
    p->clearStack();//清空
    
    if(p->stackEmpty()){cout << "栈为空!" << endl;}    
    
    delete p;
    p = NULL;
}</span>

//控制台运行结果:
栈为空!

值压入栈中:
student!

栈顶元素:
s

清空:
栈为空!

//-------------------------------------------------
//-------------------------------------------------
    ||                ||                ||
    ||                ||                ||
    ||                ||                ||
    ||                ||                ||
    \/               \/                \/
改造一下就可以成为针对类的栈机制
//-------------------------------------------------

//--Coordinate类类型栈机制实现---------------------


Coordinate.h
<span style="font-size:14px;">#ifndef COORDINATE_H
#define COORDINATE_H
//------------------
class Coordinate{
public:
    Coordinate(int x = 0, int y = 0);
    void printCoor();
private:
    int m_iX;
    int m_iY;    
};

#endif COORDINATE_H
</span>

Coordinate.cpp
<span style="font-size:14px;">#include"Coordinate.h"
#include<iostream>
using namespace std;

Coordinate::Coordinate(int x, int y):m_iX(x), m_iY(y){}

void Coordinate::printCoor(){
    cout << "(" << m_iX << "," << m_iY << ")" << endl;
}
</span>

MyStack.h
<span style="font-size:14px;">#ifndef MYSTACK_H
#define MYSTACK_H
//---------------
#include"Coordinate.h"
//----------------
class MyStack{
public:
    MyStack(int size);//初始化栈空间,设定容量
    ~MyStack();          //回收空间
    bool stackEmpty() const;//判空
    bool stackFull() const;//判满
    void clearStack();//清空
    int stackLength() const;//栈中元素个数
    bool push(Coordinate element);//入栈
    bool pop(Coordinate& element);//出栈
    void stackTraverse();//遍历
    
private:
    Coordinate* m_pStack;//栈空间指针
    int m_iSize;//容量
    int m_iTop;//个数
};

#endif MYSTACK_H</span>


MyStack.cpp
<span style="font-size:14px;">#include"MyStack.h"
#include<iostream>
using namespace std;
//-------------------------
 
MyStack::MyStack(int size){
    m_iSize = size;
    m_pStack = new Coordinate[m_iSize];
    m_iTop = 0;
}
MyStack::~MyStack(){
    delete []m_pStack;
}
bool MyStack::stackEmpty() const{
    if(0 == m_iTop)
        return true;
    else return false;
}
bool MyStack::stackFull() const{
    if(m_iTop == m_iSize)
        return true;
    else return false;
}
void MyStack::clearStack(){
    m_iTop = 0;
}
int MyStack::stackLength() const{
    return m_iTop;
}

bool MyStack::push(Coordinate element){
    if(stackFull()){
        return false;    
    }
    else{
        m_pStack[m_iTop] = element;
        m_iTop++;
        return true;
    }
}
bool MyStack::pop(Coordinate& element){
    if(stackEmpty()){
        return false;
    }
    m_iTop--;
    element = m_pStack[m_iTop];
    return true;
}
void MyStack::stackTraverse(){
    for(int i = m_iTop-1; i >= 0; i--){
        m_pStack[i].printCoor() ;//从栈顶到栈底遍历
    }
    cout << endl;
}
</span>

demo.cpp
<span style="font-size:14px;">#include<iostream>
#include"MyStack.h"
using namespace std;
//------------------
int main(){
    MyStack *p = new MyStack(8);
    
    p->push(Coordinate(1,2));//栈底
    p->push(Coordinate(3,4));//栈顶
    
    p->stackTraverse();
    
    
    delete p;
    p = NULL;
}</span>

//控制台运行结果:
(3,4)
(1,2)
//-------------------------------------------------
//-------------------------------------------------
    ||                ||                ||
    ||                ||                ||
    ||                ||                ||
    ||                ||                ||
    \/               \/                \/
栈机制没有数据类型的没有局限性从下面的类模板demo便可窥探一二
升级成模板栈机制,针对任意类型:

MyStack.h
<span style="font-size:14px;">#ifndef MYSTACK_H
#define MYSTACK_H
//---------------
//#include"Coordinate.h"
#include<iostream>
using namespace std;
//----------------
// --栈机制类模板----
//--------------------
template <typename T>
class MyStack{
public:
    MyStack(int size);//初始化栈空间,设定容量
    ~MyStack();          //回收空间
    bool stackEmpty() const;//判空
    bool stackFull() const;//判满
    void clearStack();//清空
    int stackLength() const;//栈中元素个数
    bool push(T element);//入栈
    bool pop(T& element);//出栈
    void stackTraverse();//遍历
    
private:
    T* m_pStack;//栈空间指针
    int m_iSize;//容量
    int m_iTop;//个数
};


template <typename T>
MyStack<T>::MyStack(int size){
    m_iSize = size;
    m_pStack = new T[m_iSize];
    m_iTop = 0;
}
template <typename T>
MyStack<T>::~MyStack(){
    delete []m_pStack;
}
template <typename T>
bool MyStack<T>::stackEmpty() const{
    if(0 == m_iTop)
        return true;
    else return false;
}
template <typename T>
bool MyStack<T>::stackFull() const{
    if(m_iTop == m_iSize)
        return true;
    else return false;
}
template <typename T>
void MyStack<T>::clearStack(){
    m_iTop = 0;
}
template <typename T>
int MyStack<T>::stackLength() const{
    return m_iTop;
}
template <typename T>
bool MyStack<T>::push(T element){
    if(stackFull()){
        return false;    
    }
    else{
        m_pStack[m_iTop] = element;
        m_iTop++;
        return true;
    }
}
template <typename T>
bool MyStack<T>::pop(T& element){
    if(stackEmpty()){
        return false;
    }
    m_iTop--;
    element = m_pStack[m_iTop];
    return true;
}
template <typename T>
void MyStack<T>::stackTraverse(){
    for(int i = m_iTop-1; i >= 0; i--){
        cout << m_pStack[i];//从栈顶到栈底遍历
    }
    cout << endl;
}
#endif MYSTACK_H

</span>


Coordinate.h

<span style="font-size:14px;">#ifndef COORDINATE_H
#define COORDINATE_H
//------------------
#include<ostream>
using namespace std;
//------------------
class Coordinate{
    friend ostream& operator<<(ostream& o, Coordinate& coor);//"<<"操作符重载    
public:
    Coordinate(int x = 0, int y = 0);
    void printCoor();
private:
    int m_iX;
    int m_iY;    
};

#endif COORDINATE_H</span>


Coordinate.cpp
<span style="font-size:14px;">#include"Coordinate.h"
#include<iostream>
using namespace std;

Coordinate::Coordinate(int x, int y):m_iX(x), m_iY(y){}

void Coordinate::printCoor(){
    cout << "(" << m_iX << "," << m_iY << ")" << endl;
}

ostream& operator<<(ostream& o, Coordinate& coor){
    o << "(" << coor.m_iX << "," << coor.m_iY << ")" << endl;
    return o;
}</span>


demo.cpp
<span style="font-size:14px;">#include<iostream>
#include"MyStack.h"
using namespace std;
//------------------
#include"Coordinate.h"
//------------------
int main(){
    MyStack<Coordinate> *p = new MyStack<Coordinate>(2);
    
    p->push(Coordinate(1,2));//栈底
    p->push(Coordinate(3,4));//栈顶
    
    p->stackTraverse();
    
    MyStack<char> *q = new MyStack<char>(4);
    q->push('!');
    q->push('w');
    q->push('o');
    q->push('W');
    
    q->stackTraverse();
    
    delete p;
    delete q;
    q = NULL;
    p = NULL;
}</span>

//控制台运行结果:
(3,4)
(1,2)

Wow!

//-------------------------------------------------------

//-------------------------------------------------------

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值