4.栈和队列--大话数据结构

1.栈

定义:是限定仅在表尾进行插入和删除操作的线性表,我们允许插入和删除的一端称为栈顶(top),另一端称为端底(bottom),(Last In First Out)。

1.2栈的顺序存储
//结构定义
typedef struct {
  int data[MAXSIZE];
  int top;
}SqStack;

//push
Status Push(SqStack *s,int e){
    if(s->top == MAXSIZE -1){
        return ERROR;
    }
    s->top++;
    s->data[s->top] = e;
    return OK;
}

//pop
Status Pop(SqStack *s,int *e){
    if(s->top == -1)
        return ERROR;
    *e = s->data[s->top];
    s->top--;
    return OK;
 }

//计算栈的长度

int QueueLength(SqQueue Q){
  return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;
}z

1.3两栈共享空间

typedef struct{
  int data[MAXSIZE];
  int top1;
  int top2;
}SqDoubleStack;
1.3栈的链式存储

定义:就是用链表实现栈
看栈和队列

栈的应用:
1.递归
2.四则运算表达式求值
后缀表达式计算结果规则: 9 3 1 - 3+ 10 2 / +;
从左到右遍历表达式的每个数字和符号,遇到数字就进栈,遇到是符号,就将处于栈顶两个数字出栈,进行运算,运算结果进栈,一直到获得结果。
中缀表达式转后缀表达式: “9 + (3 - 1) * 3 + 10 /2” -> “9 3 1 - 3
+ 10 2 / +”
规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分,若是符号,则判断其与栈顶符号的优先级,是右括号或优先级不高于栈顶符号(乘除优先加减)则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。

2队列

定义:是只允许在一端进行插入操作,而在另一端进行删除操作的线性表,队列是一种先进先出(First In First Out),允许插入的一端称为队尾,允许删除的一端称为队头。

循环队列

看栈和队列

链式队列

定义

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(-1);  
  }
s->data = e;
s->next = NULL;
Q->rear->next = s;
Q->rear = s;
return Ok;
}

出队

Status DeQueue(LinkQueue *Q,QElemType *e){
  QueuePtr p;
  if(Q->rear == Q->front){
    return ERROR;  
  }
  p = Q->front->next;
  *e = p->data;
  Q->front->next = p->next;

  if(Q->rear = =p){
    Q->rear = Q->front;
    }

free(p);
return Ok;
}

你可能感兴趣的:(4.栈和队列--大话数据结构)