一、栈的工作原理
栈机制:后进先出
二、单一数据类型栈
#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. 括号匹配