博客作业03--栈和队列
1.学习总结
思维导图
2.PTA实验作业
题目1:7-1 字符串是否对称
1.设计思路
定义栈指针s,定义n保存返回值;
输入一个字符串str;
动态申请空间;
调用函数symmetry;
n=0,输出no;n=1;输出yes;
bool symmetry(ElementType str[])
{
定义e保存出栈元素,定义栈指针st;
动态申请空间;
for i=0 to str[i]!='\0' i++;
进栈
for i=0 to str[i]!='\0' i++;{
出栈
如果str[i]!=e return false;
}
return true;
}
2. 代码截图
3.PTA提交列表说明
- 这题没有遇到什么大问题,主要要理解判断的方法,先将数组元素进栈,再逐个出栈比较,在编译器上碰到死循环的时候,主要判断循环结束是str[i]=='\0'。
题目2:7-1 报数游戏
1.设计思路
定义n,m;定义队列指针q;定义e保存出队元素,flag判断输出格式,num=0判断何时输出
输入n,m;
如果m>=n 输出error;
申请空间;
for i=1 to n
入队1到n的元素
while(!QueueEmpty(q)
{
num++;
如果n!=m 出队;入队;
否则 出队,按格式输出e,将num置为0;
}
2. 代码截图
3.PTA提交列表说明
- 一开始部分正确,只对了m>=n的情况,后面部分正确只对了m<n的情况,经过调试,发现m>=n的时候,输出error后,还会执行下面的代码,所以在m>=n的时候,缺少了结束程序,在输出error后return,得到正确答案。
题目3:7-2 银行业务队列简单模拟
1.设计思路
定义两个队列指针p,q;p存偶数,q存奇数;
定义n,m;定义e1,e2,e3保存出队元素;
申请空间;
输入n;
for i=0 to n-1
输入m;
如果m为偶 入p队;
否则 入q队;
while(!QueueEmpty(q)&&!QueueEmpty(p))
{
出队两个q队元素e1,e2,一个p队元素e3;
按格式输出e1,e2,e3;
}
while(!QueueEmpty(q))
{
出队两个q队元素e1,e2;
按格式输出e1,e2;
}
while(!QueueEmpty(p))
{
出队一个p队元素e3;
按格式输出e3;
}
2. 代码截图
3.PTA提交列表说明
- 本题没有什么大的问题出现,主要有函数第二题为模板,需要注意的是,A,B两个的效率不一样,所以定义了三个e保存出队元素,还有就是,队列不为空时的判断,还要继续输出。
3.截图本周题目集的PTA最后排名
- 本次总分:100+105=205
3.1 栈PTA排名
3.2 队列PTA排名
3.3 我的总分:2分
4. 阅读代码
用栈表示队列
class Queue {
public:
stack<int> tmp, s;
// Push element x to the back of queue.
void push(int x) {
while (!s.empty()){
tmp.push(s.top());
s.pop();
}
tmp.push(x);
while (!tmp.empty()){
s.push(tmp.top());
tmp.pop();
}
}
// Removes the element from in front of queue.
void pop(void) {
s.pop();
}
// Get the front element.
int peek(void) {
return s.top();
}
// Return whether the queue is empty.
bool empty(void) {
return s.empty();
}
};
- 用两个栈tmp和S,tmp当做中介。每次有push操作时,先将s中的元素全部倒入tmp中(s若为空则无操作),此时再进行push操作压入新元素。 操作完成后再将tmp中所有元素倒入s中,从s中弹出的元素即为队列元素的弹出顺序。pop操作则为s.pop(),empty则为s.empty()。top操作也是取s的top。