记住:!!!栈用完之后,在下次使用的时候一定要初始化!!花费了我一上午的时间,最后还是某杰想出来的。
题意:实现一个音乐播放器的操作,有3种操作。
注意:一开始播放器会播放播放列表中的第一首歌,也就是说一开始播放记录的栈中就有第一首歌
1.PRE 上一首 (如果退到了第一首歌,那么再按上一首还是第一首歌)
2.PLAY x 播放 播放列表中的第x首歌
3.NEXT 下一首 (如果到了最后一首,那么再按下一首还是最后一首)
注意:当播放器播放一首歌时,如果该歌曲与播放记录中的最后一首不同或者播放记录为空,便将该歌曲添加到播放记录中成为最后一首。
思路:可以直接用STL中的stack栈,也可以自己用数组写一个
代码:
#include<iostream> #include<stdio.h> #include<stack> using namespace std; stack<int> st; int t; int n,m; char command[10]; int number; int now; void next(){//next操作 if(now==n) printf("%d ",now);//到了最后一首了,怎么按下一首还是最后一首 else{ now++; st.push(now); printf("%d ",now); } } void pre(){//pre操作 st.pop(); if(st.size()==0){//说明当前是第一首歌,后退操作后还应该是播放第一首 now=1; st.push(now);//此处保证了栈永远不为空,最少也有第一首歌 printf("%d ",now); } else{ now=st.top(); printf("%d ",now); } } void play(){//play操作 if(number!=st.top()){//当前的歌曲不同于播放记录中最后一首时,把当前歌曲设为播放记录中的最后一首 now=number; st.push(now); printf("%d ",now); } else{ printf("%d ",now); } } int main(){ scanf("%d",&t); while(t--){ while(!st.empty()){//一定要清空栈!血的教训!! st.pop(); } scanf("%d %d",&n,&m); st.push(1); now=1; while(m--){ scanf("%s",command); if(command[1]=='E'){ next(); } else if(command[1]=='R'){ pre(); } else{ scanf("%d",&number); play(); } } } return 0; }