栈和队列
目录
0.PTA得分截图
1.本周学习总结
1.1 栈
- 栈的图形
- 定义:栈是一种线性结构,相比数组,栈的对应的操作是数组的子集,只能从一端添加元素,也只能从一端删除元素(这一端称为栈顶)。
1.1.1 顺序栈
1.顺序栈图形
2.顺序栈相关知识
- 栈空条件:top=-1
- 栈满条件:top=maxsize-1
1.1.2 链栈的结构、操作函数
- 定义:采用链式存储结构的栈称为链栈,这里采用带头节点的单链表来实现链栈。
栈的定义
1 typedef struct sta
2 {
3 int stack[SIZE]; /* 存放栈中元素的一维数组 */
4 int top; /* 存放栈顶元素的下标 */
5 }stack;
栈的初始化
1 /* Function:栈的初始化 */
2 stack InitStack (stack p)
3 {
4 p.bottom = (int *)malloc(p.stack_size * sizeof(int));
5 if (p.bottom == NULL)
6 {
7 printf("初始化栈失败\n");
8 exit(0);
9 }
10 p.top = p.bottom;
11 p.stack_size = MAX_SIZE;
12
13 return p;
14 }
入栈
/* Function:入栈 */
stack Push (stack p)
{
int data;
if (StackFull(p) == Full)
{
printf("栈空间已满,无法入栈");
return p;
}
printf("Please input data");
scanf("%d", &data);
*p.top = data;
p.top++;
return p;
}
出栈
1 /* Function:出栈 */
2 stack Pop (stack p)
3 {
4 if (StackEmpty(p) == Empty)
5 {
6 printf("栈为空栈,无法出栈 ");
7 return p;
8 }
9 p.top--;
10 printf("出栈元素为:%d\n", *p.top);
11
12 return p;
13 }
判断栈是否为空
bool StackEmpty(SqStack s)
{
return (s->top == -1);
}
链栈四个要素:
- 栈空的条件:s->next == NULL.
- 栈满的条件:链栈中可以看成不存在栈.
- 元素e的进栈操作:新建节点存放e,将节点插入到头节点之后.
- 出栈操作:取出首节点的data值并将其删除.
1.2 栈的应用
- 符号配对
- 中缀表达式转后缀表达式
1.3 队列
1.画一个队列的图形
2.
- 初始化队列
void InitQueue(SqQueue * &q)
{
q = (SqQueue *)malloc(sizeof(SqQueue));
q->front = q->rear = -1;
}
- 销毁队列
void DestoryQueue(Squeue * &q)
{
free(q);
}
- 判断队列是否为空
bool QueueEmpty(SqQueue * Q)
{
return(q->front == q->rear);
}
- 进队
Status EnQueue(SqQueue *Q,QElemtype e)
{
if(Q->rear==QUEUESIZE)
{
return ERROR;
}
Q->base[Q->rear]=e;
Q->rear++;
return OK;
}
- 出队
Status DeQueue(SqQueue *Q,QElemtype *e)
{
if(Q->front==Q->rear)
{
return ERROR;
}
*e=Q->base[Q->front];
Q->front++;
return OK;
}
2.PTA实验作业
2.1符号配对
2.1.1解题思路
解题:输入一串字符串,遍历字符,将左括号依次放入栈中,在从栈顶开始和接下来的字符串比较,如果符号配对,就将栈顶的符号输出,继续比较下一个,最后观察栈是否为空。
伪代码:
定义栈q
定义字符串t并输入
for(i=0 to t[i]!='\0')
{
if(不是括号)
continue
if(左括号)
入栈
else if(右括号)
{
if(栈空)
退出循环
else
{
if(数组符号与栈顶配对)
出栈
}
}
}
if(栈为空且字符串完全遍历)
输出yes
else if(栈空)
输出no
else
{
输出栈顶元素和no
}
2.2银行业务队列简单模拟
2.2.1解题思路
解题:先根据输入的数据,分为奇数和偶数两个队列,然后依次a处理两个奇数,b处理一个奇数,最后再看奇偶队列中 哪个剩余,剩余的直接输出在最后。
伪代码:
定义奇偶队列
输入人数
while(小于人数)
{
输入编号num
if(num%2==0)
进入偶队列
else
进入奇队列
}
if(两队列剩余人数都不为一)
{
while(两队列人数不空)
两次输出奇队列队尾,出队
一次输出偶队列队尾,出队
}
else if(奇或偶队列人数为一)
直接输出,出队
while(奇不为空或者偶不为空)
将剩余队列中的元素输出并出队