• 栈的基本概念:
  • 栈的定义:一种只能在一端进行插入或者删除的线性表,这一端称为栈顶
  • 栈的特点:先进后出
  • 栈的存储结构:顺序栈和链式栈

 

  • 队列的基本概念:
  • 队列的定义:允许在表的一端(队尾)进行插入,在另一端(队头)进行删除的线性表
  • 队列的特点:先进先出
  • 队列的存储结构:顺序队和链队

 

  • 栈和队列的存储结构、算法:
  • 顺序栈的定义:
typedef struct
{
    int data[maxSize];  //存放栈中的元素
    int top;        //栈顶指针
}SqStack;
  • 链栈结点定义:
typedef struct LNode
{
    int data;       //数据域
    int LNode *next;//指针域
}LNode;
  • 顺序队列定义:
typedef struct 
{
    int data[maxSize];       
    int front;//队首指针
    int rear; //队尾指针
}SqQueue;
  • 链队定义:
  • 队结点类型定义:
typedef struct QNode
{
    int data;       
    struct QNode *next; //指针域
}QNode;
  • 链队类型定义:
typedef struct 
{
    QNode *front;
    QNode *rear;
}LiQueue;

 

  • 顺序栈的基本算法操作:
  • 顺序栈st的要素
  • 两个状态:
  • 栈空状态:st.top==-1
  • 栈满状态:st.top==maxSize-1;
  • 两个操作:
  • 元素x进栈操作 ++(st.top);   st.data[st.top]=x;
  • 元素x出栈操作 x=st.data[st.top];  --(st.top);
  • 非法状态,上溢和下溢

 

  • 初始化栈的算法:
void initStack(Sqstack &st) //初始化栈
{
    st.top = -1;   //将栈顶设置为-1
}
  • 判断栈空的算法:
int isEmpty(Sqstack st) 
{
   if(st.top==-1)
        return 1;
   else
        return 0;
}
  • 进栈算法:
int Push(SqStack &st, int x)
{
    if(st.top == maxSize-1)
        return 0;
    ++(st.top);                        //先移动指针再进栈
    st.data[st.top]=x;
        return 1;
}
  • 出栈算法:
int Pop(SqStack &st, int &x)
{
    if(st.top == -1)
        return 0;
    x = st.data[st.top];   //先取出元素,再进行指针的移动
    --(st.top);
        return 1;
}

 

  • 考题中实用的栈操作写法:
  • 声明一个栈并且初始化:      int stack[maxSize];  int top=-1;    //声明加初始化都有了
  • 元素x进栈:                          stack[++top]=x;
  • 元素x出栈:                           x=stack[top--];
  • //++top 与top++的区别 :a=++top 是 top 先自增1,再将top值给a; 而b=top++ 是top先给b,再进行top自增1

 

  • 链栈的基本算法操作:
  • 链栈的要素:
  • 状态:
  • 栈空状态:1st ->next = null;
  • 两个操作:
  • 元素进栈:   
p->next = 1st->next;
1st->next = p;    //头插法建立链表的插入操作
  • 出栈操作:
p = 1st->next;
x = p->data;
1st->next = p->next;
free(p);   //单链表删除操作
  • 链栈的初始化算法:
void InitStack(LNode *&1st)
{
    1st = (LNode*) malloc(sizeof(LNode));  //制造一个头结点
    1st->next = NULL;
}
  • 判断栈空的算法:
int isEmpty(LNode *1st)
{
    if(1st->next = NULL)
        return 1;
    else 
        return 0;
}
  • 进栈算法:
void push(LNode *1st,int x)
{
    LNode *p;
    p = (LNode*)malloc(sizeof(LNode));
    p->next = NULL;
    
    
    P->data = x;
    p->next = 1st->next;
    1st->next = p;
}
  • 出栈算法:
void Pop(LNode *1st,int &x)
{
    LNode *p;
    if(1st->next==NULL)
        return 0;
    
//单链表删除操作
    p = 1st->next;
    x = p->data;
    1st->next = p->next;
    free(p);
    return 1;
}

 

  • 顺序队的算法操作:
  • 要素:
  • 两个状态:
  • 队空状态:  qu.rear = qu.front;
  • 队满状态:    (qu.rear+1)%maxSize == qu.front;
  • 两个操作:
  • 元素x进队:qu.rear = (qu.rear + 1) % maxSize;   qu. data [qu.rear] = x;
  • 元素x出队:qu.front = (qu.front + 1) % maxSize;   x = qu.data[qu.front];
  • 初始化队列:
void InitQueue(SqQueue &qu)
{
    qu.front = qu.rear = 0;
}
  • 判断队空:
int QueueEmpty(sqQueue qu)
{
    if(qu.front = qu.rear)
        return 1;
    else
    return 0;
}
  • 元素进队:
int enQueue(sqQueue &qu,int x)
{
    if((qu.rear+1)%maxSize == qu.rear)
        return 0;
    qu.rear = (qu.rear+1)%maxSize;
    qu.data[qu.rear] = x;
    return 1;
}
  • 元素出队:
int deQueue(sqQueue &qu, int &x)
{
    if(qu.front ==qu.rear)
        return 0;
    qu.front = (qu.front+1)% maxSize;
    x = qu.data[qu.front];
    return 1;
}

 

  • 链队算法操作;
  • 链队的要素:
  • 状态:
  • 队空状态:lqu->rear  ==  NULL或者lqu->front == NULL;
  • 两个操作:
  • 元素进队操作:     lqu->rear->next = p;  lqu ->rear = p;
  • 元素出队操作:  p = lqu ->front ; lqu->front = p->next; x=p->data;free(p);
  • 初始化链队的算法:
void Initqueue(Liqueue *&lqu)
{
    lqu=(LiQueue *)malloc(sizeof(LiQueue));
    lqu->front = lqu->rear = NULL;
}
  • 判断队空的算法:
int QueueEmpty(LiQueue *lqu)
{
    if(lqu->rear==NULL ||lqu->front==NULL)
        return 1;
    else 
        return 0;
}
  • 入队的算法:
void enQueue(LiQueue *lqu, int x)
{
    QNode *p;
    p = (QNode*)malloc(sizeof(QNode));
    p->data = x;
    p->next = NULL;
    if(lqu->rear==NULL)
        lqu->front=lqu->rear=p;
    else
    {
        lqu->rear->next=p;
        lqu->rear=p;
    }
}
  • 出队算法:
int dequeue(LiQueue *lqu, int &x)
{
    QNode *p;
    if(lqu->rear=front)
        return 0;
    else
        p = lqu->front;
    if(lqu->front = lqu->rear)
        lqu->front = lqu->rear =NULL;
    else
        lqu->front = lqu->front->next;
    x = p->data;
    free(p);
    return 1;
}