数算第三章书面作业
2018-10-09 本文已影响0人
细雨沉沙
3.1
top():
int flag=0 //统计队列中元素个数的同时将元素压入a
while(!A.empty())
{
flag++;
T tmp=A.front();
A.pop_front();
B.push_back(tmp);
}
while(flag-1) //弹出除最后一个之外的元素便得到top()
{
T tmp=B.front();
A.push_back(tmp)
B.pop_front();
flag--;
}
int result=B.front();
时间复杂度为O(n)
pop():
int flag=0 //统计队列中元素个数的同时将元素压入a
while(!A.empty())
{
flag++;
T tmp=A.front();
A.pop_front();
B.push_back(tmp);
}
while(flag-1) //将除了最后一个元素之外的元素都转移给A
{
T tmp=B.front();
A.push_back(tmp)
B.pop_front();
flag--;
}
B.pop();//弹出最后一个元素实现pop()
时间复杂度为O(n)
push():
A.push_back(T x)
时间复杂度为O(1);
empty()
A.empty();
时间复杂度为O(1);
3.2
设F(n)为n个数出栈的序列个数,假设最后出栈的元素为k(k<=n),那么比k小的k-1个元素先于k出栈,此种情况有F(k-1)个,比k大的元素先于k出栈的情况有F(n-k)个(F(0)=1),由于这两中情况互不干扰,所以可以相乘,既有F(n)=
f(0)f(n-1)+f(1)f(n-2)+……+f(n-1)f(0)=C(2n,n)/n+1;
3.3
最外层循环while最多循环n次,内部循环最多2n次,故时间复杂度为O(n^2)