第三章学习小结
第三章学习了栈和队列,还有递归,有了前一章线性表的学习,感觉对栈和队列的理解会容易很多。栈和队列的主要区别在于其运算规则:栈是后进先出,而队列是先进先出。
下面给出栈和队列的定义以及一些基本操作
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提交的作业中,大致能自己理清思路打出来,不过总是会犯一些很小的错误导致代码运行不正确,希望能在下一阶段学习中更加细心点,继续加油!