栈(stack)是一种特殊的线性表,先入栈的元素最后出去(FILO),仅在表尾及逆行插入和删除,表尾称为栈顶(top),表头称为栈底(bottom)。
基本操作:构造空栈、销毁栈、清空栈、去栈顶元素、入栈、出栈、遍历栈。
1.顺序栈的实现
顺序栈是指利用顺序存储结构实现的栈,同时附设指针top表示栈顶元素,如果top=base,则为空栈。
1.1自己定义的栈数据结构
1.1.1stack.h
#pragma once
#ifndef STACK
#define STACK
#include<iostream>
#define MAXSIZE 100
using namespace std;
struct Stack {
int* top;//栈顶指针
int* base;//栈顶指针,类似于顺序表的基元素,但是一直位于栈底,如果 base 为空则栈不存在
int stacksize;//栈的可使用的最大容量
};
class SqStack {
public:
SqStack() {
S.base = new int(MAXSIZE);
S.top = S.base;
S.stacksize = MAXSIZE;
}
void push(int el) {
if (S.top - S.base != S.stacksize)
*S.top++ = el;
}
int pull() {
int el;
if (S.top != S.base)
el = *--S.top ;
return el;
};
int getTop() {
int el;
if (S.top != S.base)
el = *--S.top;
S.top++;
return el;
};
void clearStack() {
if (S.top == S.base)
cout << "已经清空栈";
while (S.top != S.base)
*--S.top;
};
void createStack(int n) {
int i = 0;
for (i; i <n; i++){
cin >> *S.top++;
}
}
void prin() {
int i = 0;
cout << "栈中元素个数为:" << (S.top - S.base) << endl;
cout << "遍历栈" << endl;
int* p;
p = S.top;
for (i; i < (S.top - S.base); i++)
cout << *--p << endl;
}
private:
Stack S;
};
#endif // !STACK;
1.1.2sqstack.cpp
#include<iostream>
#include"stack.h"
using namespace std;
int main() {
SqStack S;
cout << "创建一个栈"<<endl;
S.createStack(5);
//S.prin();
cout << "压入6" << endl;
S.push(6);
//S.prin();
cout << "出栈" << endl;
S.pull();
//S.prin();
cout << "栈顶元素:" << S.getTop() << endl;
cout << "清除栈中元素" << endl;
S.clearStack();
}
1.2用c++STL库的vector实现
1.2.1stack.h
#ifndef STACK
#define STACK
#include<vector>
template<class T,int caoacity=30>
class Stack {
public:
Stack() {
pool.reserve(capacity);//开创capacity大的空间
}
void clear() {
pool.clear();//清楚向量的所有元素
}
bool isEmpty() const {
return pool.empty();//判断向量是否为空
}
T& topEL() {
return pool.back();//返回向量的最后一个值
}
T pop() {
T el = pool.back();
pool.pop_back();//删除向量的最后一个元素
return el;
}
void push(const T& el) {
pool.push_back(el);//向末尾插入el
}
void print
private:
vector<T> pool;
};
# endif
2链式栈的实现
2.1自己定义的链式栈
2.1.1 stack.h
#pragma once
#ifndef STACK
#define STACK
#include<iostream>
#define MAXSIZE 100
using namespace std;
struct SNODE {
int data;
SNODE* next;
};
class SqStack {
public:
SqStack() {
sl = new SNODE;
sl->next = NULL;
sl->data = NULL;
length = 0;
}
void push(int el) {
SNODE* p;
p = new SNODE;
p->data = el;
p->next = sl->next;
sl->next = p;
length += 1;
};
int pull() {
int el;
SNODE* p;
el = sl->next->data;
p = sl->next;
sl->next = p->next;
delete p;
length -= 1;
return el;
};
int getTop() {
int el;
el = sl->next->data;
return el;
}
void clearStack() {
SNODE* p;
p = sl->next;
while (p != NULL) {
sl->next = p->next;
delete p;
p = sl->next;
}
};
void createStack(int n) {
int i = 0;
for (i; i < n; i++) {
SNODE* p;
p = new SNODE;
cin >> p->data;
p->next = sl->next;
sl ->next = p;
length += 1;
}
};
void prin() {
SNODE *p;
p = sl->next;
cout << "遍历结果" << endl;
while (p != NULL) {
cout << p->data<<endl;
p = p->next;
}
cout << "栈的长度:" << length << endl;
}
private:
SNODE *sl;
int length;
};
#endif // !STACK;
2.1.2 stack.cpp
#include<iostream>
#include"stack.h"
using namespace std;
int main() {
SqStack S;
cout << "创建一个栈"<<endl;
S.createStack(5);
//S.prin();
cout << "压入6" << endl;
S.push(6);
//S.prin();
cout << "出栈" << endl;
S.pull();
//S.prin();
cout << "栈顶元素:" << S.getTop() << endl;
cout << "清除栈中元素" << endl;
S.clearStack();
}
2.2 STL库l实现的栈
#include<iostream>
#include<list>
template<class T>
class Stack {
public:
Stack() {}
void push(T el) {
sl.push_front(el);
};
void clear() {
sl.clear();
}
bool isEmpty()const {
return sl.empty();
}
T pull() {
T el = sl.front();
sl.pop_front();
return el;
};
T& getTop()const {
return sl.front();
};
int getLength() {
return sl.size();
}
private:
list<T> sl;
};
int main() {
Stack<int> s;
int el;
for (int i = 0; i < 5; i++) {
cin >> el;
s.push(el);
}
cout <<"长度"<< s.getLength() << endl;
cout <<"出栈"<< s.pull();
cout <<"长度" <<s.getLength()<<endl;
}