1 ,约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。最后剩下1号。
void Josephus(int x,int m)
{
//x代表总共的节点数,m为从头开始数到m ,删除掉m 后,从m的下一个位置开始从1计数
node *p=new node();
p->num=1;
node *q;
q=p;
//循环链表用q做头结点
for(int i=2;i<x+1;i++)
{
node *tt=new node();
tt->num=i;
p->next=tt;
p=tt;
}
p->next=q;
node *temp;
int tm;
while(x>0)
{
tm=m;
//删除节点计数的控制逻辑
while (tm-1>0)
{
p=p->next;
q=q->next;
tm--;
}
//找到需要删除的节点
temp=q;
q=q->next;
p->next=q;
cout<<temp->num<<endl;
delete temp;
x--;
}
}
2 ,一次遍历就能找到单链表的中间节点
用两个指针,每次 一个走一步,另外一个一次走两步,第二个走完时第一个正好在中间
void find_mid()
{
node *dfd=new node();
node *p,*q;
node x;
x.num=7;
p=&x;
q=&x;
int m=6;
while (m>0)
{
m--;
node temp;;
temp.num=m;
(p->next)=&temp;
p=&temp;
}
p=q;
while(q->next->next)
{
q=q->next->next;
p=p->next;
}
cout<<p->num;
}
3 ,用vector 实现栈的功能
void usingStack()
{
stack s;
for (int i=1;i<=10;i++)
s.push(i);
for (int i=1;i<=10;i++)
s.pop();
}
class stack
{
private:
vector<int> v;
node *top;
node *zhandi;
public:
void push(int i)//入栈
{
v.push_back(i);
}
void pop()//出栈
{
if (v.size()!=0)
{
cout<<"出栈数据是:"<<v[v.size()-1]<<endl;
v.pop_back();
}
}
};
4,用两个栈来实现队列的功能
template <class T>
struct MyQueue
{
stack<T> s1;
stack<T> s2;
void push(T &t)
{
s1.push(t);
}
void pop()
{
if(s2.empty())
{
while(!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
}
else
{
s2.pop();
}
}
T& front()
{
if(s2.empty())
{
while(!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
}
return s2.top();
}
};
void usingMyqueue()
{
MyQueue<int> q;
for(int i=0;i<10;i++)
{
cout<<i<<" " ;
q.push(i);
}
cout<<endl;
for (int j=0;j<10;j++)
{
cout<<q.front()<<" ";
q.pop();
}
}