第三章:
- 相比较普通线性表,栈的区别是什么?栈的元素的进出原则是什么?请简单解释下列术语:栈顶、栈顶元素、栈底、进栈、出栈。
栈是限定仅可在表尾进行插入与删除操作的操作受限的线性表
进出原则:先进后出,后进先出
栈顶:表尾端
栈底:表头端
栈顶元素:表尾端元素
进栈:表尾端插入元素
出栈:表尾端删除元素,删除栈顶元素
2、 顺序栈的定义: typedet struct {
ElemType *base; //动态分配方案,指针 base 指向栈元素空间的及地址;
int top; //栈顶指针,实际是记录栈顶元素下一单元的下标,简称为栈顶指针; int stacksize; //栈空间的最大长度
}SqStack; SqStack s; //s 为顺序栈的变量
请根据上述定义,给出元素 e 进栈(注意判断栈是否已满)程序段,给出出栈的程序段
(注意判断是否为空栈)。
//将元素e入栈
Status Push(SqStack& S, SElemType e)//传入栈的地址和元素e
{
if (S.top - S.base >= S.stacksize)
{
//S.base = (SElemType*)realloc(S.base,(S.stacksize + STACKINCREMENT) * sizeof(SElemType));//如果栈满,追加存储空间
}
if (!S.base)
{
exit(OVERFLOW);//存储分配失败返回错误值
}
*S.top = e;//e赋值给当前栈顶
S.top++;//栈顶指针+1
return 0;
3、 链栈的定义如下:
struct node {
ElemType data; //栈元素
Struct node *next; //指下一个结点
} *top=NULL; //链栈没有头结点,用指针 top 指向栈顶结点,top 为空时为空栈初始化链栈为空栈
根据上述定义,请给出元素 e 进栈的程序段,给出出栈的程序段(注意判断栈空)
//将元素e入栈
Status Push(LinkStack& S, SElemType e)
{
SNode* P;//生成一个SNode形的指针
P = (LinkStack)malloc( sizeof(SNode));//这个指针指向一个新的SNode类新的结点
P->data = e;//这个结点的数据域上的指针指向传进来的元素e
P->next = S;//新结点插向栈顶,这里新节点的P指针的地址域指向了栈顶S指针
S = P;//S这个头指针重新指向栈顶
//注意,链栈的指针是一直指向栈顶的,通过从栈顶指向下一个来实现栈的先进后出!!!
return OK;
}
- 给出求下述表达式值的过程:#8+5-3*6+(7-1)/2#
操入左,运入右
栈空直接入,不空看优先
大于则出栈,否则都入栈
左括直接入,遇右吐出来
- 相比较普通线性表,队列的区别是什么?队列的元素的进出原则是什么?请简单解释下列术语:队首元素、队尾元素、入队、出队。
区别:队列是仅限一端插入另一端删除得操作受限得线性表
原则,先进先出,后进后出
队首元素:表头元素
队尾元素:表尾元素
入队:从表尾插入新的元素
出队:删除表头元素
- 在链式存储的队列中插入一个新元素,描述算法思路
新建一个结点,插入尾指针指针域,尾指针移动到新的结点得指针域
- 在链式存储的队列中删除一个元素,描述算法思路
新建一个P指针指向队头指针指针域,队头指针后移一位,释放P指针
- 如何解决队列顺序存储结构出现的假溢出问题,给出具体解决方案。
臆设一个环状空间
- 在循环队列中,当用 front 记录队首元素,rear 记录队尾元素下一个空间,当front=rear 时,循环队列可能为空,也可能是已满,怎么进行区分,给出解决方案,并给出不同解决方案中,判断队空和队满的条件。
方案1:设置一个标志区分 满为rear==标志;空为front==rear
方案2:少用一个元素空间,队满:(rear+1)%MAXQSIZE==front;队空:front==rear
- 给出循环队列元素入队的算法思路
- 判断队列是否满
- 新元素入队尾
- 队尾指针+1
- 给出循环队列元素出队的算法思路。
- 判空
- 对头元素删除
- 头指针-1