栈的定义
栈是一种运算受限的线性表,是一种先进后出的数据结构,限定只能在一端进行插入和删除操作,允许操作的一端称为栈顶,不允许操作的称为栈底。
顺序存储结构:
1、元素所占的存储空间必须连续(这里的连续是指逻辑连续,而不是物理连续)
2、元素在存储空间的位置是按照逻辑顺序存放的
从上面可以很简明的看出栈的结构。
栈的简单实现
#include <iostream>
#include <stdlib.h>
using namespace std;
#define Max_size 100
typedef struct sta
{
int top; //栈顶元素
int data[Max_size];
int size; //栈的大小
}stack;
stack InitStack() //栈的初始化
{
stack s;
s.size = Max_size;
s.top = -1;
return s;
}
//判断栈是否为空
bool StackEmpty(stack s)
{
if (s.top == -1)
{
return true;
}
else
return false;
}
//判断栈是否已满
bool StackFull(stack s)
{
if (s.top == Max_size - 1)
{
return true;
}
else
{
return false;
}
}
void push(stack &s, int data) //入栈
{
if (StackFull(s) == true)
{
cout << "栈已满,不可入栈" << endl;
}
s.top++;
s.data[s.top] = data;
}
void pop(stack& s) //出栈
{
if (StackEmpty(s) == true)
{
cout << "空栈!!!无法出栈" << endl;
}
else
{
int x = s.data[s.top];
cout << "出栈元素为:" << x << endl;
s.top--;
}
}
//遍历栈中的元素
void display(stack s)
{
while (s.top != -1)
{
cout << s.data[s.top] << " ";
s.top--;
}
cout << endl;
}
int main()
{
stack p;
p = InitStack();
cout << "入栈元素为:" << endl;
push(p, 1);
push(p, 2);
push(p, 3);
push(p, 4);
display(p);
pop(p);
display(p);
system("pause");
return 0;
}
栈的应用
栈的应用有很多:比如括号匹配,逆波兰表达式
这里主要讲一种:逆波兰表达式
- 基本思路:
如果字符串时空的,直接返回0。
如果不为空,将数字全部入栈,遇到字符运算符就不入栈,直接取出栈顶的两个元素,进行运算,再将结果存入栈,继续获取字符,以此类推。 - 代码如下:
class Solution
{
public:
int evalRPN(vector<string>& tokens)
{
if(tokens.size()==0)
return 0;
stack<int> tmp;
for(int i=0;i<tokens.size();i++)
{
if(tokens[i].size()>1||(tokens[i].size()==1
&&tokens[i]>="0"&&tokens[i]<="9"))
{
tmp.push(atoi(tokens[i].c_str()));
}
else
{
int a=tmp.top();
tmp.pop();
int b=tmp.top();
tmp.pop();
int res;
if(tokens[i]=="+")
res=a+b;
else if(tokens[i]=="-")
res=b-a;
else if(tokens[i]=="*")
res=a*b;
else if(tokens[i]=="/")
res=b/a;
tmp.push(res);
}
}
return tmp.top();
}
};