第三章学习小结

第三章学习了栈和队列,还有递归,有了前一章线性表的学习,感觉对栈和队列的理解会容易很多。栈和队列的主要区别在于其运算规则:栈是后进先出,而队列是先进先出。

下面给出栈和队列的定义以及一些基本操作

typedef struct
{
  SElemType data[MAXSIZE];
  int top;//标记栈顶
  int stacksize;//标记栈的最大容量      
}SqStack;//顺序栈的定义

//初始化栈,让栈顶标志指向栈底 
void init(SqStack &s)
{
  s.top=0;
  s.stacksize=MAXSIZE;    
}

//判断栈满,当栈顶标志指向栈最大容量时,说明栈满了 
bool stackfull(SqStack s)
{
    if(s.top==s.stacksize)
        return true;
    else    return false;
}

//判断栈空,栈顶标志指向栈底,说明是空栈
bool stackempty(SqStack s)
{
    if(s.top==0)    return true;
    else    return false;
} 

//入栈,元素e压入栈顶,栈顶标志加1,入栈前要判断是否栈满 
void push(SqStack &s, SElemType e)
{
    s.data[s.top++]=e;
} 

//出栈,栈顶标志减1,获取栈顶元素e, 出栈前要判断是否栈空 
void pop(SqStack &s, SElemType &e)
{
    s.top--;
    e=s.data[s.top];
} 
 

如果是链栈,操作也不难,定义栈时,让头指针作为栈顶标志,,但因为插入删除操作都在栈顶进行,故初始化时不需要设置头结点,直接把头指针设置为空就可以啦,判断是否是空栈也是判断头指针是否是空。

接下来是队列:

typedef struct
{
    QElemType data[MAXSIZE];
    int front;//头指针 
    int rear;//尾指针 
}SqQueue;//队列的定义

//初始化,直接让头指针和尾指针等于0
void init(SqQueue &q)
{
    q.front=q.rear=0;
} 

//判断队列是否满
bool queuefull(SqQueue q)
{
    if(q.rear+1)%MAXSIZE==q.front;
        return true;
    else    return false;
} 

//判断队列是否为空
bool queueempty(SqQueue q)
{
    if(q.front==q.rear)    return true;
    else    return false;
} 

//入队
void enqueue(SqQueue &q, QElemType e)
{
    q.data[q.rear]=e;
    q.rear=(q.rear+1)%MAXSIZE;
} 

//出队
void outqueue(SqQueue &q, QElemType &e)
{
    e=q.data[q.front];
    q.front=(q.front+1)%MAXSIZE;
} 

如果使用链队就设置头指针和尾指针,然后注意表头删除表尾插入,其他操作和链表的差不多。

然后最后一个知识点是递归,递归和栈结合一起学习更容易理解。

可以概括得理解成:

viod p(参数表)
{
  if(递归终止条件) 直接求解;//递归终止
  else p(参数);//递归求解       
}

 

pta提交的作业中,大致能自己理清思路打出来,不过总是会犯一些很小的错误导致代码运行不正确,希望能在下一阶段学习中更加细心点,继续加油!

posted @ 2020-04-24 19:19  Jadfhjva  阅读(221)  评论(0编辑  收藏  举报