성가신 웨이브 소음 데이터 구조 (II)

토크 데이터 구조 스택

수이 Suinian

에서 데이터 구조 성가신 웨이브 소음의 (a) , 스택에 대한 참조가,가, 우리는 (높은 수준의 언어로 사용을 찾을 수있는 컴퓨터 분야에서 매우 중요한 개념이라고 할 수있다 stack<int>, 우리는 또한 어셈블리 언어로) 찾을 수 있습니다 (니모닉 push스택 관련 및 개념)이 적층조차 알 수있다 (예를 들면, 86의 부동 소수점 레지스터 구조를 특정)의 하드웨어이다.

우리는 스택에 대해 얘기하고, 그것은 일반적으로 다음 두 가지 조건을 의미한다 :

  1. 스택 (프로그램에 사용 stack<int>) 및 관련 작업.

  2. (아니 스택 포인터 stack<int>top질문 변수지만, 메모리 할당 스택 오버플로 이런 종류의 프로그램 실행)

문제가 있습니다 : 우리는 일반적으로 참조 스택 사실에, 스택 두 가지 요소. 힙을 이해하는, 이야기의 대부분은 힙 정렬 기본 언어의 더 나은 이해를 위해,에 대해 이야기합니다, 힙에 할당되는 특정 변수 및 특정 변수는 스택에 할당 조금 더 깊은 메모리를 이야기합니다 다음과 힙과 스택 영역의 (성장 방향, 캐싱, 라이프 사이클과 같은 이야기), 더 깊이 ...... emmm ...... 미안 해요, 내 제한된 수준, 더 이상 얘기하지.

스택

데이터 구조의 정의에 스택은 매우 간단하다 : 하나는 스택의 선형 수술대 위에 수있다 .

이 정의는 명확하게 스택 선형 테이블이어야 정의하고 암시 적으로 스택 맨의 수를 제한합니다.

어떤 사람들은이 스택의 상단에 있어야한다고 주장 할 권리뿐만 아니라? 우리는 어떻게 스택 맨의 수를 논의 할 것인가?

스택은 절대 개념 (상단, 상단입니다 상단 이상)의 경우, 스택의 상단 정말 하나 말할 수 있습니다.

그러나 스택의 최상위에 대한 정의는 스택의 바닥은 그 반대, 그럼 그냥 스택의 바닥 아래, 위의 스택 사실이다.

내가 질문처럼, 두 개의 평행 한 선을 교차? 거의 모든 사람들이 무의식적으로 대답한다, 두 개의 평행 한 선이 잘못 교차하지? 예. 이 문제는 유클리드 기하학 시스템에서 논의에서하지만이 질문에 대답하기 전에, 우리는 묵인했다. 다른 비 유클리드 기하학에서,이 질문에 대한 대답은 경우되지 않습니다.

스택의 상단의 수

  1. 스택의 상단은 수, 숫자 0입니까?

(스택되지 않음) 스택을 지정하지 않을 경우 대답은 '아니오'이다, 다음 스택이 존재하지 않는 것을 의미한다, 더 입구 작업이 없습니다.

또는 누군가가이의 일반 선형 형태로 스택에서 변질되지 않고, 말할 수 있는가? 스택 자체가 선형 테이블이지만, 부과하기 때문에 나는, 명확한 대답을 할 수없는 제약 조건을 스택 만의 특수성을 보유하고 있습니다. 이 제약없이, 스택 호출 할 수 없다.

  1. 스택의 상단은 숫자 1, 표준 스택입니다

스택의이 유형은 먼저 스택의 바텀 - 업 성장을 생각한다 :

스택의 상향식 성장

다음과 같은 그것의 구현은 :

const int MAXSIZE = 10;
// 1. 声明一个栈
int stack[MAXSIZE];
int top = -1;

// 2. 栈空
top == -1;

// 3. 栈满
top == MAXSIZE;

// 4. 压栈push(x)
stack[top++] = x;

// 5. 弹栈pop()
int x = stack[top--];

// 6. 读取栈顶元素
int x = stack[top];
复制代码

이 구현은 보편적으로 한 언어를 지원 어레이로서, 기본적으로이 방법을 사용하여 간단한 고정 된 크기의 스택을 달성 할 수있다라고 할 수있다.

이 실시 예에서, 우리는 인덱스 위치 -1, 스택의 성장 방향에 구비되는 스택의 하단에서 기본값으로 -1-> 10 , 차례로,이 적층 체의 하부의 위치 때문에,도 제공 가능 스택 상대적이다.

참고 : 대부분의 언어에서, -1, [-1] 위반 오류를 액세스 할 스택을 사용, 부정한 인덱스이며,이 오류는 치명적인 오류 (태아 오류가), 프로그램이 종료됩니다이다. 그러나 일부 언어, -1 합법적 인 인덱스, 인덱스가 뒤에서 앞으로를 나타내는, 즉 stack[-1] = stack[MAXSIZE-1];. 여기에 1 개 인덱스 -1 위치의 값으로, 액세스 액세스를 시도하지 않는, 단지 배열의 첫 번째 요소 앞에있는, 말, 그것은 불법 운영 규정의 단지 언어 아니라 메모리, -1 해당 위치하면서 , 위치에 액세스 초기화 할 수 없습니다, 당신이 (정말 성공적인 방문, 보통 INT 타입의 값의 표시가있는 경우),이 위치는 다른 변수, 또는 프로그램에 배포되었을 수 있습니다 잘못된 값을받을 수 있습니다, 그래서 방문이 성공적으로 이번에는 다른 프로그램, 심지어 운영 시스템 충돌, 돌이킬 수없는 손실을 만들 것입니다. 물론, 컴파일러와, 우리가 불법 콘텐츠 인덱싱, 또는 단지 액세스에 액세스 할 수 없습니다 배열 때문에,이 문제를 조사하기 위해 가상 기회가 주어집니다. 목록이 구현되면 체인 스택을 , 우리는 포인터를 사용하도록주의해야합니다.

  1. 스택 2 스택의 수는 존재 하는가?

두 스택은 스택은 각각 중간 -1 향해 양쪽 동시에 증가에 상기 MAXSIZE 위치에 대응하고, 물론 거기에 공유로되어있다.

(1) 및 어레이 인덱스 10

공유 스택

top1 = -1;
top2 = MAXSIZE;

// top1压栈做自增操作,弹栈做自减操作
// top2压栈做自减操作,弹栈做自增操作
// 栈满是top1+1 == top2;
复制代码

메모리, 스택과 힙의 여유 공간을 공유에서 공유 스택 같은 비트, 우리는에 "스택"또는 이유를 참조하십시오.

  1. 스택의 상단은 숫자 2보다 큰 존재?

지금까지, 우리는 내용이 스택의 구멍이 열려있는 뇌의 상단이 2보다 큰 찾을 수있는 방법을 한 후, 하나의 차원입니다 논의했다.

그리고 확장 스택을 공유하도록 강요하는 경우, 우리가 정말 수가 2보다 큰 스택의 상단을 찾을 수 있지만,이 시간, 우리는이 문서의 논리적 결함을 찾을 수 should'll,이 섹션의 토론이 허점은 치명적이다.

치명적인 결함

이 문서는 표준 부문을 논의 할 때 스택의 스택 맨의 수를 기반으로하지만, 여기에서 보는 우리는 스택의 상단의 수는 2보다 크거나 같은 경우, 즉, 논리적 결함을 찾을 수 있어야합니다, 그는보다는 스택 이상입니다 스택까지.

이 문서에서 설명하는 어떤 따라서 분할 수 단위의 스택 형식으로 스택의 상단은없고, 그? 복합 스택이? 어 비트있다. 그러나 우리를 위해, 그것은 그러한 사용의 복잡한을 다음과 같이 보인다 :

template <class T>
class MinStack<T> {
private:
  stack<T> st;
  stack<T> min;
}

// 最小栈的算法,还是挺经典的,可以自己查一查。
复制代码

최소 스택

개요

이 문서의 내용은 하나의 스택에, 요약, 또한 약 2 기본 개념을 이야기한다.

물리적 구조에 따라, 스택은 크게 두 가지 범주로 구분된다 :

  1. 스택 순서

순차 저장 순서라고 스택 스택 : 메모리에 응용 프로그램의 집합 인접한 스택의 요소를 저장하는 저장 부, 즉, 어레이가 달성 될 수있다.

  1. 체인 스택

스택 메모리의 스택 호출 체인 사용 체인 :에 스택 메모리 소자 불연속을 각 메모리 셀의 어드레스가 저장 위치에있는 작은 소자를 보유하는 동안은, 단일 연결리스트 구현이 고려 될 수있다.

스택 스택 및 체인 순서

생각, 실현을 넣어 스택을 구현하기 어렵지 않다 기사는 조금 긴, 그래서 나는 코드를 누르고 있습니다.

계란 | ू · ω ·) :이 기사에서 얻을 것은 그냥 누군가가이 문서에서 보낼 수 있기를 바랍니다, 믿을 수있는 대답은 무엇 아무도 그가 매우 심층적 인 기사라고 문서를 보낼 감히 나이는 독립적으로 생각하는 법을 배워야 매우 깊이있는 글 오해의 소지가, 겉으로는 매우 합리적인하지 않습니다. 그들이 말하는, 책임이있는 사람이 기사를 작성했습니다 아니, 그것은 성가신입니다.

추천

출처juejin.im/post/5d87539bf265da03d2117d3d