数据结构学习:栈的模板类实现

来源:互联网 发布:ptc软件收费模式 编辑:程序博客网 时间:2024/06/05 11:38

参考:http://www.imooc.com/learn/611

栈机制:后进先出 LIFO(last in first out)
栈机构

下面是我用模板类实现的栈:

#pragma once#ifndef  STACK_H#define STACK_H#include <iostream>using namespace std;template <typename T>class Stack {private:    T *m_pBuffer;//栈空间指针    int m_iCapacity;//栈容量    int m_iTop;//栈顶,栈中元素个数public:    Stack(int size);//创建栈    ~Stack();//销毁栈    bool isEmpty();//判空    bool isFull();//判满    void clearStack();//清空栈    int size();//栈中元素个数    bool push(T element);//入栈    bool pop(T &element);//出栈    T top();//获取栈顶元素    void traverseStack(bool isFromTop);};#endif // ! STACK_htemplate<typename T>inline Stack<T>::Stack(int size){    m_pBuffer = new T[size];    m_iCapacity = size;    m_iTop = 0; }template<typename T>inline Stack<T>::~Stack(){    delete []m_pBuffer;    m_pBuffer = NULL;}template<typename T>inline bool Stack<T>::isEmpty(){    return m_iTop == 0 ? true: false;}template<typename T>inline bool Stack<T>::isFull(){    return m_iTop==m_iCapacity?true:false;}template<typename T>inline void Stack<T>::clearStack(){    m_iTop = 0;}template<typename T>inline int Stack<T>::size(){    return m_iTop;}template<typename T>inline bool Stack<T>::push(T element){    if(isFull())        return false;    else {        m_pBuffer[m_iTop] = element;        m_iTop++;        return true;    }}template<typename T>inline bool Stack<T>::pop(T & element){    if(isEmpty())        return false;    else {        m_iTop--;        element = m_pBuffer[m_iTop];        return true;    }}template<typename T>inline T Stack<T>::top(){    return m_pBuffer[m_iTop-1];}template<typename T>inline void Stack<T>::traverseStack(bool isFromTop){    if (isFromTop) {        for (int i = m_iTop - 1; i >= 0; i--) {            cout << m_pBuffer[i] << " ";        }    }    else {        for (int i = 0; i < m_iTop; i++) {            cout << m_pBuffer[i] << " ";        }    }}

利用这个栈,实现两个问题:
(1)十进制到K进制的转换。
(2)判断括号是否匹配。

(1)十进制到K进制的转换。
输入:十进制数 转换的进制
输出:转换后的数

#include "stdafx.h"#include "Stack.h"#include <iostream>using namespace std;char a[] = "0123456789ABCDEF";int main(){    int num;    int K;    while (cin >> num>>K)    {        Stack<int> *pStack = new Stack<int>(10e6);        int red = 0;        while (num>0)        {            red = num % K;            pStack->push(red);            num = num / K;        }        int e;        while (!pStack->isEmpty())        {            pStack->pop(e);            cout << a[e];        }        cout << endl;        delete pStack;        pStack = NULL;    }    return 0;}

(2)判断括号是否匹配。
输入:待判断的括号字符串
输出:判断结果

#include "stdafx.h"#include "Stack.h"#include <iostream>#include <string>using namespace std;int main(){    string s;    while (cin >> s)    {        Stack<char> *pStack = new Stack<char>(10e6);        bool flag = true;        char e;        for each (char current in s)        {            switch (current)            {            case '(':            case '[':            case '{':                pStack->push(current);                break;            case ')':                if (pStack->isEmpty())                    flag = false;                pStack->pop(e);                if (e != '(')                    flag = false;                break;            case ']':                if (pStack->isEmpty())                    flag = false;                pStack->pop(e);                if (e != '[')                    flag = false;                break;            case '}':                if (pStack->isEmpty())                    flag = false;                pStack->pop(e);                if (e != '{')                    flag = false;                break;            default:                break;            }        }        if (flag && (pStack->isEmpty()))        {            cout << "括号匹配!" << endl;        }        else        {            cout << "括号不匹配!" << endl;        }        delete pStack;        pStack = NULL;    }    return 0;}

如有不足,欢迎指正!

0 0
原创粉丝点击