栈的定义
先进后出的线性表。
栈是一个 S T L STL STL 中的容器(严格意义上来讲,不算容器,它是一个容器适配器),在 s t d std std 命名空间中,它限制插入和删除都在一个位置上(栈顶上),底层是 d e q u e deque deque(双端队列)。
( F I L O FILO FILO,先进后出)
栈的结构
图片不是很完美,请见谅。
最下面的元素叫栈底元素。
栈的基本操作
p
u
s
h
(
x
)
push(x)
push(x):将元素
x
x
x 压入栈顶。
p
o
p
(
)
pop()
pop():将栈顶元素弹出。
e
m
p
t
y
(
)
empty()
empty():判断栈是否为空,为空返回
t
r
u
e
true
true,否则返回
f
a
l
s
e
false
false。
s
i
z
e
(
)
size()
size():返回栈的大小。
t
o
p
(
)
top()
top():返回栈顶元素,不弹出。
栈的定义方式和函数调用
std::stack<_Tp> Stack_Name;
//_Tp表示定义类型,Stack_Name处是该栈的名称。
/**
* 如果前面写了using namespace std 或 using std::stack,
* 可以不写 "std::"
*/
_Tp x;
Stack_Name.push(x);//压入元素
Stack_Name.pop();//弹出栈顶元素
_Tp w=Stack_Name.top();//返回栈顶元素
bool Emp=Stack_Name.empty();//判断栈是否为空
size_type size=Stack_Name.size();//返回栈的大小
//size_type 可以理解为 unsigned int
经典例题
逆波兰式 \mathbf {\color {#99FF33} 逆波兰式{}} 逆波兰式
L e e t c o d e Leetcode Leetcode
题目略有不同,此处以 Y A C S \mathbf {YACS} YACS 题目为准,即需要 m o d 10 \mod 10 mod10。
附上代码:
数组模拟
#include<bits/stdc++.h>//万能头文件
using namespace std;
int top,tmp;
char x;
int a[100001];//数组模拟
int main()
{
top=0;
while(cin>>x)
{
if(x==' ') continue;
if(x<'0'||x>'9')
if(x=='+')
{
tmp=a[top-1]+a[top];
tmp%=10;
if(tmp<0) tmp+=10;
top--;
a[top]=tmp;
}
else if(x=='-')
{
tmp=a[top-1]-a[top];
tmp%=10;
if(tmp<0) tmp+=10;
top--;
a[top]=tmp;
}
else
{
tmp=a[top-1]*a[top];
tmp%=10;
if(tmp<0) tmp+=10;
top--;
a[top]=tmp;
}
else
{
top++;
a[top]=x-48;
}
}
cout<<a[top];
return 0;
}
S T L STL STL 容器 s t a c k stack stack 做法
#include <bits/stdc++.h>
using namespace std;
stack<int> S;
char ch;
int main()
{
while(cin>>ch)
{
if(ch<'0'||ch>'9')
{
int tmp;
switch(ch)
{
case '+':tmp=S.top()%10;S.pop();tmp=(S.top()%10+tmp)%10;S.pop();break;
case '-':tmp=S.top()%10;S.pop();tmp=(S.top()%10-tmp)%10;S.pop();break;
default:tmp=S.top()%10;S.pop();tmp=(S.top()%10*tmp)%10;S.pop();break;
}
S.push(tmp);
}
else
S.push(ch-48);
}
printf("%d",abs(S.top()));
return 0;
}