(一)栈和队列的基本概念

- 栈(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()从队头到队尾遍历等。

 目录

posted @ 2021-09-07 00:20  白玉神驹  阅读(771)  评论(0编辑  收藏  举报