"서쪽으로 데이터 구조"연구 노트 세

제 4 장 스택과 큐

스택 테이블은 트레일러 만 삽입과 삭제 작업 선형 정의된다.
큐 삽입 연산은 일단이 상기 선형 테이블 삭제 작업의 타단에 허용된다.

정의 스택

스택 (스택)은 트레일러 선형 만 삽입 및 삭제 동작을 정의하는 테이블이다.

우리는 스택 삽입 및 일단 호출 스택 (위)의 삭제를 허용하고, 타단은 비어있는 호출 스택 데이터 요소없이 적층 바닥 (바닥)이라고한다. 라고도 LIFO 스택 (최종 먼저 출력) 선형 형태 LIFO 구조 함.

스택으로 불리는 동작을 삽입 스택은, 또한 푸시, 푸시라고도합니다.
스택이라고 삭제 작업, 일부라는 터지는 스택.

팝 변형을 밀어

이상의 구성 요소의 개수보다, 적층 순서는 가능한 여러있다.

추상 데이터 타입 스택

ADT 栈
Data
  同线性表。元素具有相同的类型,相邻元素具有前驱和后继关系。
Operation
  InitStack(*S):初始化操作,建立一个空栈S。
  DestroyStack(*S):若栈存在,则销毁它。
  ClearStack(*S):将栈清空。
  StackEmpty(S):若栈为空,返回 true ,否则返回 false。
  GetTop(S,*e):若栈存在且非空,用e返回S的栈顶元素。
  Push(*S,e):若栈S存在,插入新元素e到栈S中并成为栈顶元素。
  Pop(*S,e):删除栈S中的栈顶元素,并用e返回其值。
  StackLength(S):返回栈S的元素个数。
endADT

순차 저장 스택 구조 및 구현

순차 저장 스택 구조

스택 구조 정의

typedef init SElemType;
typedef struct
{
  SElemType data[MAXSIZE]
  int top;     /* 用于栈顶指针 */
}SqStack;

순차적으로 적층 구조를 저장 - 스택으로.

다음과 같이 푸시 조작 푸시는, 어떤 코드입니다 :

Status Push (SqStack *S, SElemType e)
{
  if (S->top == MAXSIZE - 1) /* 栈满 */
  {
    return ERROR;
  }
  S->top++;   /* 栈顶指针增加一 */
  S->data[S->top]=e;   /* 将新插入元素赋值给栈顶空间 */
  return OK;
}

순차 저장 구조 적층 - 스택 동작

있는 그대로 다음되는 코드 팝 작업, 팝업 :

Status Pop (SqStack *S, SElemType *e)
{
  if(S->top==-1)
    return ERROR;
  *e=S->data[S->top]; /* 将要删除的栈顶元素赋值给e */
  S->top--;   /* 栈顶指针减一 */
  return OK;
}

모든 루프를 포함하지 않고 푸시 및 팝, 따라서 시간 복잡도 O (1)이다.

이 개 공유 공간을 스택

이러한 데이터 구조의 사용, 공간 요구 대향 관계, 두 스택이있는 통상시 즉, 스택 커지면 단축 (a)의 경우에 다른 스택.

스토리지 구조와 스택의 실현

연결된 저장 구조의 스택

스택의 저장 구조는 링크 스택이라.
다음과 같이 코드의 링크 스택 구조는 다음과 같습니다

typedef struct StackNode
{
  SElemType data;
  struct StackNode *next;
}StackNode, *LinkStackPtr;

typedef struct LinkStack
{
  LinkStackPtr top;
  int count;
}

저장 구조 스택 - 스택 상.

/* 插入元素 e 为新的栈顶元素 */
Status Push (LinkStack *S, SElemType e)
{
  LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode));
  s->data = e;
  s->next = s->top;  /* 把当前的栈顶元素赋值给新结点的直接后继 */
  S->top = s;  /* 将新的结点s赋值给栈顶指针 */
  S->count++;
  return OK;
}

저장 구조 스택 - 팝 동작

변수 (P)를 제거 할 수 P를 릴리스 마지막 하나의 아래에서, 상기 스택 포인터를 저장 노드를 적층하는 데 사용되는 것으로 가정한다.

Status Pop (LinkStack *S, SElemType *e)
{
  LinkStackPtr p;
  if (StackEmpty(*S))
    return ERROR;
  *e = S->top->data;
  p=S->top;  /* 将栈顶结点赋值给p */
  S->top=S->top->next;  /* 使得栈顶指针下移一位,指向后一结点 */
  free(p);  /* 释放结点 p */
  S->count--;
  return OK;
}

링크 스택 및 시간 복잡도 O (1)이며, 상기 스택 팝 동작에 스택 동작의주기를 더 밀어 없다.
요소의 사용 중에 스택이 매우 큰 가끔, 아주 작은, 때로는 예측할 수없는 변경하는 경우가 더 좋을 것이다 스택의 순서를 사용하여 제어 범위에서 변경하는 경우, 그것은 반면, 링크 스택을 사용하는 것이 가장 좋습니다.

스택의 역할

스택의 도입은 좁은 생각이 더 많은 우리가 해결해야 할 핵심 문제에 초점을 맞추고 그래서, 프로그래밍, 관심의 서로 다른 수준의 분단의 문제를 단순화합니다.

응용 프로그램의 스택 - 재귀

피보나치는 달성하기 위해 열 수를 잘라

int Fbi (int i)
{
  if (i < 2)
    return i == 0 ? 0 : 1;
  return Fbi(i-1) + Fbi(i-2);
}
int main()
{
  int i;
  for (int i = 0;i < 40; i++)
    printf("%d ", Fbi(i));
  return 0;
}

재귀 정의

높은 수준의 언어, 서로 다른 통화와 다른 기능에서 자체는 중요하지 않습니다. 우리는 직접 전화를 소유 또는 재귀 함수라는 일련의 명령문을 호출하여 간접적으로 자신의 함수를 호출합니다.
각 재귀 적 정의는 더 이상, 적어도 하나 개의 조건이 없다 더 이상 자신을 참조하지 않고 종료에 값을 반환하는 재귀을 충족해야합니다.

응용 프로그램의 스택 - 네 산술 식 평가

  1. 중위 식 접미사로 (서명 작업에 스택 점 만점).

  2. 접미사 발현 결과를 산출한다 (디지털 동작 스택 중).

큐의 정의

큐 (큐)는 단지 상기 삽입 단부와 상기 선형 테이블 삭제 작업의 타단에 허용된다.

큐는 FIFO로 지칭되는 FIFO (선입) 선형 형태이다. 허가 삽입 끝, 꼬리라고 불리는 큐의 헤드 엔드를 삭제할 수 있습니다.

큐 추상 데이터 타입

ADT 队列(Queue)

Data
  同线性表。元素具有相同的类型,相邻元素具有前缀和后继关系。
Operation
  InitQueue(*Q):初始化操作,建立一个空队列Q。
  DestroyQueue(*Q):若队列Q存在,则销毁它。
  ClearQueue(*Q):将队列Q清空。
  QueueEmpty(*Q):若队列Q为空,返回 true,否则返回 false。
  GetHead(Q,*e):若队列Q存在且非空,用e返回队列Q的队头元素。
  EnQueue(*Q,e):若队列Q存在,插入新元素e到队列Q中并成为队尾元素。
  DeQueue(*Q,*e):删除队列Q中队头元素,并用e返回其值。
  QueueLength(Q):返回队列Q的元素个数。
endADT

원형 큐

순환 큐 정의

우리는 칭한다 순차 접촉 순환 큐 구조를 저장하는 큐의 머리와 꼬리라고 부른다.

저장 구조 큐

저장 구조 큐 사실, 폼 선형 단쇄하지만 단지 그것의 단부에 밖으로 향할 수 우리는 체인 큐 부른다.
체인 구성 큐는 다음과 같습니다

typedef int QElemType;

typedef struct QNode  /* 节点结构 */
{
  QElemType data;
  struct QNode *next;
}QNode,*QueuePtr;

typedef struct  /* 队列的链表结构 */
{
  QueuePtr front,rear; /* 队头、队尾指针 */
}LinkQueue;

저장 구조 큐 - 인큐 작동

Status EnQueue(LinkQueue *Q, QElemType e)
{
  QueuePtr s = (QueuePtr)malloc(sizeof(QNode));
  if(!s)  /* 存储分配失败 */
    exit(OVERFLOW);
  s->data = e;
  s->next = NULL;
  Q->rear->next = s;  /* 把拥有元素e新结点s赋值给原队尾节点的后继 */
  Q->rear = s;  /* 把当前的s设置为队尾结点,rear指向s */
  return OK;
}

저장 구조 큐 - 디큐

Status DeQueue(LinkQueue *Q, QElemType *e)
{
  QueuePtr p;
  if(Q->front==Q->rear)
    return ERROR;
  p=Q->front->next;  /* 将欲删除的队头结点暂存给p */
  *e=p->data;  /* 将欲删除的队头结点的值赋值给e */
  Q->front->next=p->next;  /* 将原队头结点后继p->next赋值给头结点后缀 */
  if(Q->rear==p)  /* 若队头是队尾,则删除后将rear指向头结点 */
    Q->rear=Q->front;
  free(p);
  return OK;
}

경우에 당신은 당신이 큐의 길이, 체인과 큐를 예측할 수없는 경우 최대 큐 길이가 원형 큐를 사용하는 것이 좋습니다 확인할 수 있습니다.

게시 10 개 원래 기사 · 원 찬양 1 ·은 20000 +를 볼

추천

출처blog.csdn.net/pass7580/article/details/104544729