您的位置:首页 > 理论基础 > 数据结构算法

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

2017-04-08 16:11 162 查看
参考: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_h

template<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;
}


如有不足,欢迎指正!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构