[] 데이터 구조 - 스택 및 애플리케이션 스택 (역 폴란드 표기법)

정의 스택

스택 동작은 후자의 데이터 구조의 상세 아웃이 허용되지 않는 스택 동작의 아래쪽으로 알려진 동작의 종료를 허용하는, 스택의 상단 불리는 일단 삽입과 삭제 만 정의하고, 제한된 선형 테이블이다.

순차 저장 구조 :
도 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