当前位置: 代码迷 >> 综合 >> 1021. 可旋栈
  详细解决方案

1021. 可旋栈

热度:38   发布时间:2023-12-06 11:29:29.0

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
第一次见到这种写法所以补充一下
在这里插入图片描述
思路:
这道题一开始用的办法就是最傻的办法
1,2就不用说了吧,3的话就把数组整个换个顺序

#include <cstdio>
#include <iostream>
using namespace std;
int n;
struct STACK
{
    int top,data[1111111]={
    -1};void init(){
    top=0;}int size(){
    return top;}void pop(){
    top--;}void push(const int &x){
    top++;data[top]=x;}
}st;
int main()
{
    int x,y;cin>>n;for(int i=1;i<=n;i++){
    cin>>x;if(x==1){
    cin>>y;st.push(y);cout<<st.data[st.size()]<<endl;continue;} if(x==2){
    if(st.size()==0) continue;else st.pop();cout<<st.data[st.size()]<<endl;continue;}if(x==3){
    if(st.size()==0) continue;else{
    for(int i=1;i<=(st.size()/2);i++){
    int temp=st.data[i];st.data[i]=st.data[(st.size())+1-i];st.data[(st.size())+1-i]=temp;}cout<<st.data[st.size()]<<endl;}continue;}}return 0;
}

看了看数据范围这是显然会超时的

然后了解还有种办法:可以搞个flag标记到底哪里是正着放还是反着放,数组只要稍微开大一点就行。
我写的代码:

#include <cstdio>
#include <iostream>
using namespace std;
struct QUEUE
{
    int head,tail,data[6666666];void init(){
    head=300000;tail=300000;}int  size(){
    return tail-head;}int front(){
    return data[head];}int back(){
    return data[tail-1];}void pop_back(){
    tail--;}void pop_front(){
    head++;}void push_back(const int &x){
    data[tail]=x;tail++;}void push_front(const int &x){
    head--;data[head]=x;}
}qu;
int main()
{
    int q;cin>>q;int flag=0;qu.init();for(int i=1;i<=q;i++){
    int x;cin>>x;if(x==1){
    int y;cin>>y;if(flag==0) qu.push_back(y);if(flag==1) qu.push_front(y);}if(x==2){
    if(qu.size()==0) continue;if(flag==0) qu.pop_back();if(flag==1) qu.pop_front();}if(x==3) flag=flag^1;if(qu.size()==0) cout<<"-1"<<endl;else {
    if(flag==0) cout<<qu.back()<<endl;if(flag==1) cout<<qu.front()<<endl;}}return 0;
}

大佬的代码:
简洁版:

#include <bits/stdc++.h>
int a[666666],head,tail,q;
bool status=0;
int main()
{
    head=tail=300010;tail--;scanf("%d",&q);for (int i=1;i<=q;i++){
    int op;//optionscanf("%d",&op);if (op==1){
    int x;scanf("%d",&x);tail+=status^1;head-=status;a[status?head:tail]=x;}else if (op==2){
    tail-=status^1;head+=status;}else status^=1;printf("%d\n",head>tail?-1:a[status?head:tail]);}return 0;
}

规范版:

#include <bits/stdc++.h>
struct deque
{
    int a[666666],head=300010,tail=300010-1;void push_back(const int &x){
    a[++tail]=x;}void push_front(const int &x){
    a[--head]=x;}void pop_back(){
    --tail;}void pop_front(){
    ++head;}int back(){
    return a[tail];}int front(){
    return a[head];}bool empty(){
    return head>tail;}
}de;
bool status=0;
int q;
int main()
{
    scanf("%d",&q);for (int i=1;i<=q;i++){
    int op;//optionscanf("%d",&op);if (op==1){
    int x;scanf("%d",&x);if (!status) de.push_back(x);else de.push_front(x);}else if (op==2){
    if (!status) de.pop_back();else de.pop_front();}else status^=1;printf("%d\n",de.empty()?-1:(status?de.front():de.back()));}return 0;
}

tips:
虽然是第一次见,但是还是渐渐对这个^(异或)有了一定的感觉
1^1=0;
1^0=1;
能够很巧妙的在1和0之间转换