博客作业03--栈和队列
1.学习总结
1.1 写出你认为本周学习中比较重要的知识点关键词
1.1 写出你认为本周学习中比较重要的知识点关键词,如逻辑结构、栈、队列、存储结构等。
1.2 使用思维导图将这些关键词组织起来。
2.PTA实验作业
2.1 题目1:7-1 jmu-字符串是否对称
2.2 设计思路
int Palindrome(char str[],int n)//判断字符串是否对称的函数
{
定义字符指针p并指向字符串str;
定义栈的结构体s;
for(如果p小于str+n/2执行循环)
将p指向的字符串入栈;
每次循环p++
if(n%2) p++;
while(p不为空时)
{
定义x用来储存每次出栈的元素;
将s中的元素出栈;
if(x不等于p指向的元素及字符串不对称时)
return 0;
p++;
}
判断完毕字符串对称
return 1;
}
int main()
{
定义整形变量len来储存字符串长度;
定义字符串数组来储存输入的字符串;
输入字符串并储存于str;
len=strlen(str);
if(如果函数Palindrome判断为1){
printf("yes");
}
else
{
printf("no");
}
return 0;
}
2.3 代码截图
2.4 PTA提交列表说明
题目2:7-2 银行业务队列简单模拟
设计思路
int main()
{
定义queue类的参考值 q;
定义整形变量n来储存要排队的人数;
输入n;
定义整形数组a[10002];
定义整形变量sum=-1 i作为循环数;
for(当i小于n时执行循环)
{
输入一个整数并存于a[i]中;
if(当a[i]为奇数时)
令sum=i;
}
定义整型变量k=0 u=0用来判断;
令i=0;
for(当i小于n时执行循环)
{
if(a[i]为奇数时)
{
if(u==0)
{
输出a[i];
并令u=1;
}
否则
输出空格后输出a[i];
k++;
}
else if(a[i]为偶数时)
{
a[i]出队;
}
if((k为2且q.empty()==false)或者(i小于sum并且q.empty()==false))
{
if(sum==-1)
{
输出q.front();
并令sum=-2;
}
else
输出空格后输出q.front();
q.pop();
k=0;
}
}
return 0;
}
代码截图
2.4 PTA提交列表说明
本题主要问题时提交时没选择好编译器导致编译错误以及空格输出没看清所以判定了格式错误
题目3:7-1 jmu-报数游戏
设计思路
判断m,n的大小
if(m>n) 输出error!
for i=0 to i=n入队,并将其编号
if 队列不为空
头指针开始递增
尾指针循环
end
每次念一个数字 如果不是指定数字则将这个人出队再入队,如果是则出队,并输出此人编号,并从头读数。
代码截图
PTA提交列表说明
当m<n时没有结束这个程序,所以还会继续执行,所以只要补上return 0。
3.截图本周题目集的PTA最后排名
3.1 栈PTA排名
3.2 队列PTA排名
3.3 我的总分:165
4. 阅读代码
template<class T>
class Queue1
{
public:
void Push(T d)
{
if (s1.empty() && s2.empty())
{
s1.push(d);
}
else if (!s1.empty() && s2.empty())
{
s1.push(d);
}
else
{
s2.push(d);
}
}
void Pop()
{
if (!s1.empty() && s2.empty())
{
while (!s1.empty()) //把所有的数放到s2中去
{
s2.push(s1.top());
s1.pop();
}
s2.pop(); //真正要删除的那个数
while (!s2.empty()) //把剩下的数放回s1中
{
s1.push(s2.top());
s2.pop();
}
}
else if (s1.empty() && !s2.empty())
{
while (!s2.empty()) //把所有的数放到s1中去
{
s1.push(s2.top());
s2.pop();
}
s1.pop(); //真正要删除的那个数
while (!s1.empty()) //把剩下的数放回s2中
{
s2.push(s1.top());
s1.pop();
}
}
else
return;
}
T& Front()
{
assert(!s1.empty() || !s2.empty());
if (!s1.empty() && s2.empty())
{
while (!s1.empty()) //把所有的数放到s2中去
{
s2.push(s1.top());
s1.pop();
}
T top = s2.top(); //保存队头
while (!s2.empty()) //把所有的数放回s1中
{
s1.push(s2.top());
s2.pop();
}
return top;
}
else if (s1.empty() && !s2.empty())
{
while (!s2.empty()) //把所有的数放到s1中去
{
s1.push(s2.top());
s2.pop();
}
T top = s1.top(); //保存队头
while (!s1.empty()) //把所有的数放回s2中
{
s2.push(s1.top());
s1.pop();
}
return top;
}
}
T& Back()
{
assert(!s1.empty() || !s2.empty());
if (!s1.empty() && s2.empty())
{
return s1.top();
}
else if (s1.empty() && !s2.empty())
{
return s2.top();
}
}
bool Empty()
{
return s1.empty() && s2.empty();
}
size_t Size()
{
return s1.size() + s2.size();
}
private:
stack<T> s1;
stack<T> s2;
};
template<class T>
class Queue2
{
public:
void Push(T d)
{
sIn.push(d);
}
void Pop()
{
if (sOut.empty())
{
while (!sIn.empty())
{
sOut.push(sIn.top());
sIn.pop();
}
sOut.pop(); //队列真正要删除的数
}
else
{
sOut.pop();
}
}
T& Front()
{
assert(!sIn.empty() || !sOut.empty());
if (sOut.empty())
{
while (!sIn.empty())
{
sOut.push(sIn.top());
sIn.pop();
}
return sOut.top(); //保存队头
}
else
{
return sOut.top(); //保存队头
}
}
T& Back()
{
assert(!sIn.empty() || !sOut.empty());
if (!sIn.empty())
{
return sIn.top();
}
else
{
while (!sOut.empty())
{
sIn.push(sOut.top());
sOut.pop();
}
return sIn.top();
}
}
bool Empty()
{
return s1.empty() && s2.empty();
}
size_t Size()
{
return s1.size() + s2.size();
}
private:
stack<T> sIn; //sIn中只push
stack<T> sOut; //sOut中只pop
};
使用两个栈实现一个队列
1.保证在整个过程中,一个栈为空,则另外一个栈要么为空,要么有数据,不能出现两个栈同时有数据的情况,这样就可以借助为空的那个栈进行push和pop等操作了。。
2.确保其中一个栈只能push,另一个栈只能pop