栈
栈是一种特殊的链表,有时也被称为先进后出表,它对操作位置进行了限制:只能在链表的末尾进行操作,我们把栈的末端称作栈顶(top)。
栈的简易模型
对栈的基本操作就是出栈和进栈,即pop和push。前者是删除最后一个进栈的元素,后者可以等价为在链表末端的插入操作。
对于栈而言,我们可以看做是一个采用头插法的单链表,不过我们对栈的所有操作都只能在top进行实现。
下图就是一个抽象的栈。
栈的实现
由于这是一个表,所以任何对表的实现 都能实现栈,比如list和vector。而对于一般实现,我们有两种思路,第一是使用数组模拟链表,在此我们不做赘述,第二则是直接使用链表结构。这两种实现都简化了list和vector中的思路,下面我们只对链表实现进行讨论。
链表实现
#include <iostream>
using namespace std;
class Stack{
private:
int* data;//存放栈中的数据
int maxsize;//栈最大空间
int top;//栈顶
//初始化栈
void initStack() {
data = new int[maxsize];//分配栈空间
top = -1;//初始化栈顶
}
public:
//默认空间为10
Stack() {
maxsize = 10;
initStack();
}
//设置最大空间
Stack(int maxsize) {
this->maxsize = maxsize;
initStack();
}
~Stack() {
delete data;
}
//是否栈空
bool isEmpty() {
return (top == -1)?1:0;
}
//是否栈满
int isFull() {
return (top >= maxsize)?1:0;
}
//进栈
int push(int x) {
if(isFull())
return 0;
else
data[++top] = x;
return 1;
}
//出栈
int pop(int &x) {
if(isEmpty())
return 0;
else
x = data[top--];
return 1;
}
//清除栈
void clear(){
top = -1;
}
};
int main() {
return 0;
}
关于栈的应用,我实现了后缀表达式的运算,下面贴出代码实现:
<STL实现>洛谷P1449
#include<iostream>
#include<stdio.h>
#include<string>
#include<stack>
using namespace std;
stack<int>q;
string c;
int main()
{
cin >> c;
int a = 0, b = 0;
int i, j;
for (int k = 0; k < c.length(); k++)
{
if (c[k] == '@') break;
else if (c[k] == '.') {
q.push(a);
b = 0, a = 0;
}
else if (c[k] <= '9' && c[k] >= '0') {
a = b * 10 + c[k] - '0';
b = a;
}
else {
if (c[k] == '-') i = q.top(), q.pop(), j = q.top(), q.pop(), q.push(j - i);
if (c[k] == '+') i = q.top(), q.pop(), j = q.top(), q.pop(), q.push(j + i);
if (c[k] == '*') i = q.top(), q.pop(), j = q.top(), q.pop(), q.push(j * i);
if (c[k] == '/') i = q.top(), q.pop(), j = q.top(), q.pop(), q.push(j / i);
}
}
cout << q.top() << endl;
return 0;
}