数据结构之栈篇

一、栈的工作原理

栈机制:后进先出
在这里插入图片描述

二、单一数据类型栈

#ifndef MYSTACK_H
#define MYSTACK_H 
#include<iostream>
using namespace std;
class MyStack{
    public:    
        MyStack(int size); // 分配内存初始化栈空间,设定栈容量,栈顶 
        ~MyStack();  // 回收栈空间内存 
        bool stackEmpty();  // 判定栈是否为空 
        bool stackFull(); // 判定栈是否已满 
        void clearStack(); //清空栈 
        int stackLength(); // 栈长度 
        void push(char elem); // 入栈 
        void pop(char &elem); // 出栈 
        void stackTraverse(); // 遍历栈 
    private:
        char *m_pBuffer; //栈空间指针 
        int m_iSize; //栈容量 
        int m_iTop;    //栈顶、栈中元素个数 
};
MyStack::MyStack(int size) {
    m_iSize = size;
    m_pBuffer = new char[size];
    clearStack();
}
MyStack::~MyStack() {
    delete []m_pBuffer;
}
bool MyStack::stackEmpty() {
    if(m_iTop == 0) {
        return true;
    }else {
        return false;
    }
}
bool MyStack::stackFull() {
    if(m_iSize == m_iTop) {
        return true;
    } else {
        return false;
    }
}
void MyStack::clearStack() {
    m_iTop = 0;
}
int MyStack::stackLength() {
    return m_iSize;
}
void MyStack::push(char elem) {
    if(stackFull()) {
        cout<<"栈满"<<endl;
    } else {
        m_pBuffer[m_iTop] = elem;
        m_iTop++;
        m_iSize++;
    }
}
void MyStack::pop(char &elem) {
    if(stackEmpty()) {
        cout << "栈空" << endl;
    } else {
        m_iTop--;
        elem = m_pBuffer[m_iTop];
        m_iSize--;
    }
}
void MyStack::stackTraverse() {
     for(int i = 0; i < m_iTop ; i++) {
        cout << m_pBuffer[i] << endl;
    }
}
#endif

测试栈是否正确:

#include<iostream>
#include<stdlib.h>
#include"MyStack.h"


int main(){
   MyStack *p = new MyStack(5); 
   if(p->stackEmpty()) {
       cout << "栈为空" << endl;
   }
   cout << p->stackLength() << endl;
   p->push('a');
   p->push('b');
   p->push('c');
   p->push('d');
   p->push('e');
   p->stackTraverse();
   cout << p->stackLength() << endl;
   if(p->stackFull()) {
       cout << "栈为满" << endl;
   }
   char elem = 0;
   p->pop(elem);
   p->stackTraverse();
   delete p;
   p = NULL;
   return 0;
}

运行结果
在这里插入图片描述

三、栈模板

目的: 灵活掌握栈机制,理解抽象类在栈中的应用
栈要求: 将普通栈改造为模板栈,使其可适用于任何数据类型

	#ifndef MYSTACK_H
	#define MYSTACK_H 
	#include<iostream>
	using namespace std;
	
	template <typename T>
	class MyStack{
	    public:    
	        MyStack(int size); // 分配内存初始化栈空间,设定栈容量,栈顶 
	        ~MyStack();  // 回收栈空间内存 
	        bool stackEmpty();  // 判定栈是否为空 
	        bool stackFull(); // 判定栈是否已满 
	        void clearStack(); //清空栈 
	        int stackLength(); // 栈长度 
	        void push(T elem); // 入栈 
	        void pop(T &elem); // 出栈 
	        void stackTraverse(); // 遍历栈 
	    private:
	        T *m_pBuffer; //栈空间指针 
	        int m_iSize; //栈容量 
	        int m_iTop;    //栈顶、栈中元素个数 
	};
	template <typename T>
	MyStack<T>::MyStack(int size) {
	    m_iSize = size;
	    m_pBuffer = new T[size];
	    clearStack();
	}
	template <typename T>
	MyStack<T>::~MyStack() {
	    delete []m_pBuffer;
	}
	template <typename T>
	bool MyStack<T>::stackEmpty() {
	    if(m_iTop == 0) {
	        return true;
	    }else {
	        return false;
	    }
	}
	template <typename T>
	bool MyStack<T>::stackFull() {
	    if(m_iSize == m_iTop) {
	        return true;
	    } else {
	        return false;
	    }
	}
	template <typename T>
	void MyStack<T>::clearStack() {
	    m_iTop = 0;
	}
	template <typename T>
	int MyStack<T>::stackLength() {
	    return m_iTop;
	}
	template <typename T>
	void MyStack<T>::push(T elem) {
	    if(stackFull()) {
	        cout<<"栈满"<<endl;
	    } else {
	        m_pBuffer[m_iTop] = elem;
	        m_iTop++;
	        m_iSize++;
	    }
	}
	template <typename T>
	void MyStack<T>::pop(T &elem) {
	    if(stackEmpty()) {
	        cout << "栈空" << endl;
	    } else {
	        m_iTop--;
	        elem = m_pBuffer[m_iTop];
	        m_iSize--;
	    }
	}
	template <typename T>
	void MyStack<T>::stackTraverse() {
	     for(int i = 0; i < m_iTop ; i++) {
	       cout << m_pBuffer[i] << endl; 
	    }
	}
	#endif

四、栈用例

1. 进制转换
2. 括号匹配

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值