【数据结构】 --栈以及栈的应用(逆波兰表达式)

栈的定义

栈是一种运算受限的线性表,是一种先进后出的数据结构,限定只能在一端进行插入和删除操作,允许操作的一端称为栈顶,不允许操作的称为栈底。

顺序存储结构:
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();
    }
};
发布了33 篇原创文章 · 获赞 13 · 访问量 1051

猜你喜欢

转载自blog.csdn.net/Vicky_Cr/article/details/104467455