FZU 2091 播放器 (栈)

记住:!!!栈用完之后,在下次使用的时候一定要初始化!!花费了我一上午的时间,最后还是某杰想出来的。惊恐


题意:实现一个音乐播放器的操作,有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;
}



原文地址:https://www.cnblogs.com/gongpixin/p/4477385.html