博客作业03--栈和队列
1.学习总结(2分)
思维导图
2.PTA实验作业(4分)
2.1 题目1:7-1 jmu-报数游戏(15 分)
2.2 设计思路(伪代码或流程图)
定义一个新队列
for i=1 to i<=n
把各个元素一一存放到队列中
while q.size()!=1
如果0==((i+1)%m)且q.size()<m
找到该元素,直接输出队列的头元素,再把该元素出队列
否则
不是目标元素,把该队列的头元素取出再放到队列结尾
不断循环以上操作,直到队列中只剩一个元素,最后输出最后一个元素
2.3 代码截图
2.4 PTA提交列表说明。
写这道题不知道怎么用队列来实现这个算法,后来通过画示意图,得到了一个规律,就是不断把前面元素放到结尾,但是完全不会影响到要退出圈子的人的顺序,知道这个规律后,再运用queue头文件,就不难写出该代码。
2.1 题目2:7-2 银行业务队列简单模拟(25 分)
2.2 设计思路(伪代码或流程图)
定义两个新队列A和B
for i=0 to i<n
输入的数为奇数入的A队列,为偶数入B队列
end i
当A.size()!=0且B.size()!=0
A中头元素为最先办理的,输出该值后出队列,再输出A的新头元素并出队列。
第三个办理的是B头元素,输出该值并出队列。
不断循环上式,直到其中一个队列全部人都办理完业务
当B.size()!=0或A.size()!=0
输出B(A)头元素并出队列
循环直到B(A)队列都办理完业务
2.3 代码截图
2.4 PTA提交列表说明。
这个代码比较简单,只要把元素按奇偶分类成两个队列,再把两个队列中的元素按办理时间顺序依次输出。要注意的是输出A队列的第一个数后,不能直接就输出第二个,要先判断此时的A队列是否为空。
2.2 题目3:7-1 jmu-字符串是否对称(20 分)
2.2 设计思路(伪代码或流程图)
gets(a);
建立新栈CreateStack(Maxsize)
for j=0 a[j]!='\0'
把数组中的元素一一入栈
end j
for j=0 a[j]!='\0'
把栈中的元素一一出栈,并分别跟a[j]比较
如果存在 出栈元素!=a[j],证明不是对称字符串
如果循环正常跳出,即所有出栈元素均=a[i],证明是对称字符串
end j
2.3 代码截图
2.4 PTA提交列表说明。
刚开始提示段错误,但devc上明明可以运行,后来把
改成gets(a),就能通过了。
3.截图本周题目集的PTA最后排名(3分)
本次2个题目集总分:125+215=340分
必做题共:205分
3.1 栈PTA排名
3.2 队列PTA排名
3.3 我的总分
208
4. 阅读代码(必做,1分)
使用两个栈实现一个队列
template <typename T>
class CQueue
{
public:
CQueue(void)
{}
~CQueue(void)
{}
void appendTail(const T& node);
T deleteHead();
private:
stack<T> stack1;
stack<T> stack2;
};
template<class T>
void CQueue<T>::appendTail(const T& node)//在队列尾部添加数据
{
stack1.push(node);
}
template<class T>
T CQueue<T>::deleteHead()
{
T tmp = 0;
if (stack2.empty()) //若栈2为空
{
while (!stack1.empty())
{
tmp = stack1.top();
stack2.push(tmp);
stack1.pop();
}
}
tmp = stack2.top();
stack2.pop();
return tmp;
}
入队列:直接压入元素至栈1
出队列:如果栈2不为空,把栈2中的栈顶元素直接弹出。否则,把栈1的所有元素全部弹出压入栈2中,再弹出栈2的栈顶元素
这种方法思路比较简单,比较好操作。