#589. NOIP2012TG-28

NOIP2012TG-28

28.(完善程序)

(新壳栈)小Z设计了一种新的数据结构“新壳栈”。首先,它和传统的栈一样支持压入、弹出操作。此外,其栈顶的前 cc 个元素是它的壳,支持翻转操作。其中,c>2c>2 是一个固定的正整数,表示壳的厚度。小 Z 还希望,每次操作,无论是压入、弹出还是翻转,都仅用与 cc 无关的常数时间完成。聪明的你能帮助她编程实现“新壳栈”吗?

程序期望的实现效果如以下两表所示。其中,输入的第一行是正整数 cc,之后每行输入都是一条指令。

另外,如遇弹出操作时栈为空,或翻转操作时栈中元素不足 cc 个,应当输出相应的错误信息。

#include<iostream>
using namespace std;
const int
NSIZE=100000,
CSIZE=1000;
int n,c,r,tail,head,s[NSIZE],q[CSIZE];
//数组 s 模拟一个栈,n 为栈的元素个数
//数组 q 模拟一个循环队列,tail 为队尾的下标,head 为队头的下标
bool direction,empty;

int previous(int k)
{
  if(direction)
    return((k+c-2)%c)+1;
  else
    return(k%c)+1;
}

int next(int k)
{
  if(direction)
    ____________________;
  else
    return((k+c-2)%c)+1;
}

void push()
{
  int element;
  cin>>element;
  if(next(head)==tail){
    n++;
    ____________________;
    tail=next(tail);
  }
  if(empty)
    empty=false;
  else
    head=next(head);
    ____________________=element;
}

void pop()
{
  if(empty){
    cout<<"Error:the stack is empty!"<<endl;
    return;
  }
  cout<<____________________<<endl;
  if(tail==head)
    empty=true;
  else{
    head=previous(head);
    if(n>0){
      tail=previous(tail);
      ____________________=s[n];
      n--;
    }
  }
}

void reverse()
{
  int temp;
  if(____________________==tail){
    direction=!direction;
    temp=head;
    head=tail;
    tail=temp;
  }
  else
    cout<<"Error:less than"<<c<<"elements in the stack!"<<endl;
}

int main()
{
  cin>>c;
  n=0;
  tail=1;
  head=1;
  empty=true;
  direction=true;
  do{
    cin>>r;
    switch(r){
      case 1:push();break;
      case 2:pop();break;
      case 3:reverse();break;
    }
  }while(r!=0);
  return 0;
}

①:{{ input(1) }}

②:{{ input(2) }}

③:{{ input(3) }}

④:{{ input(4) }}

⑤:{{ input(5) }}

⑥:{{ input(6) }}