(一)棧和隊列的基本概念


- 棧(stack)

  • 棧(stack)是限定僅在表尾進行插入或刪除操作的線性表。因此,對棧來說,表尾端有特殊含義,稱為棧頂(top),相應地,表頭端稱為棧底(bottom)。不含元素的空表稱為空棧。
  • 棧的特點:棧的修改是按后進先出的原則進行的。因此,棧又稱為后進先出(last in first out)的線性表(LIFO)。
  • 棧的基本操作:在棧頂進行插入或刪除,棧的初始化、判空及取棧頂元素等。
//棧的基本方法-構造一個存儲字符元素的棧 即stack.h頭文件
#include<stdio.h>
#include<stdlib.h>
#define INITSIZE 100
#define INCRSIZE 10
#define ERROR 0
#define OK 1

typedef int Status;
typedef struct {//構造棧
  char *base;
  char *top;
  int size;
} SqStack;

Status InitStack(SqStack *s) {//初始化棧
  s->base = (char *)malloc(INITSIZE * sizeof(char));
  if (!s->base)
    return ERROR;
  
  s->top = s->base;
  s->size = INITSIZE;
  return OK;
}

Status ClearStack(SqStack *s) {//清空棧
  s->top = s->base;
}

Status StackEmpty(SqStack *s) {//判空
  if (s->top == s->base)
    return 1;
  else 
    return 0;
}

int StackLength(SqStack (*s) {//獲取棧的長度
  return s->top - s->base ;
} 

Status GetTop(SqStack s, char *e) {//獲取棧頂元素
  if (s.top == s.base)
    return ERROR;
  *e = *(s.top - 1);
  return OK;
}

Stack Push(SqStack *s, char e) {//壓棧
  if (s->top - s->base >= s->size) {
    s->base = (char *)realloc(s->base, (s->size + INCRSIZE)*sizeof(char));
    if (!s->base)
      exit(1);
    s->top = s->base + s->size;
    s->size += INCRSIZE;
  }
  *(s->top) = e;
  s->top ++;
  return OK;
}

Status Pop(SqStack *s, char *e) {//彈出元素
  if (s->top == s->base)
    return ERROR; 
  *e = *(--s->top);
  return OK;  
}

void StackTraverse(SqStack *s) {//打印棧中元素,棧頂->棧底
  if (!s->base)
    exit(1);
  char *t = s->top - 1;
  while(t >= s->base) {
    printf("%c", *t);
    t--;
  } 
}
//c++棧的基本方法
#include<iostream>
using namespace std;

#define starksize 100 
typedef struct{
    char *base;
    char *top;
    int length ;
}StarkTR

typedef struct{
    int *base;
    int *top;
    int length ;
}StarkND; //寄存操作數

int InitTR(StarkTR &L){   //初始化寄存operater棧 
    L.base = new char[starksize];
    L.top = L.base;
    L.length = starksize; 
    return 1;
}

int PushTR(StarkTR &L,char e){   //入棧 
    if(L.top - L.base == L.length){
        cout<<"棧滿!";
        return 0; 
    }
    *L.top++ = e;
    return 1;
}

char PopTR(StarkTR &L,char &e){   //出棧 
    if(L.top - L.base == 0){
        cout<<"棧空!";
        return 0;
    }
    e = *--L.top;
    return 1;
}

char GetTopTR(StarkTR L){  //取棧頂元素 字符
    if(L.top != L.base)
        return *(L.top -1); 
}

int GetTopND(StarkND L){  //取棧頂元素 數值
    if(L.top != L.base)
        return *(L.top -1); 
}

 

- 隊列(queue)

  • 隊列(queue)和棧相反,是一種先進先出(first in first out,FIFO)的線性表。它允許在表的一端進行插入,而在另一端刪除元素。這和我們生活中的排隊是一致的,最早進入隊列的元素最早離開。在隊列中,允許插入的一端叫做隊尾(rear),允許刪除的一端則稱為隊頭(front)。
  • 隊列的基本操作:初始化空隊列、清空隊列、判空、獲取隊列的長度、獲取隊頭元素、插入隊尾元素、刪除隊頭元素、visit()從隊頭到隊尾遍歷等。

 目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM