#CS50801. 完善程序8-栈和队列-1双栈模拟数组

完善程序8-栈和队列-1双栈模拟数组

双栈模拟数组

只使用两个栈结构 stack1\mathrm{stack1}stack2\mathrm{stack2},模拟对数组的随机读取。作为栈结构,stack1\mathrm{stack1} stack2\mathrm{stack2} 只能访问栈顶(最后一个有效元素)。栈顶指针top1 \mathrm{top1} top2\mathrm{top2} 均指向栈顶元素的下一个位置。

输入第一行包含的两个整数,分别是数组长度 n 和访问次数 m,中间用单个空格隔开。

第二行包含 n 个整数,一次给出数组各项(数组下标从 0 到 a−1)。第三行包含 m 个整数,需要访问的数组下标。对于每次访问,输出对应的数组元素。

#include <stdio.h>
const int    SIZE = 100;
int        stack1[SIZE], stack2[SIZE];
int        top1, top2;
int        n, m, i, j;
void clearStack()
{
    int i;
    for ( i = top1; i < SIZE; i++ )
        stack[i] = 0;
    for ( i = top2; i < SIZE; i++ )
        stack[i] = 0;
}
int main(){
    scanf( "%d,%d", &n, &m );
    for ( i = 0; i < n; i++ )
        scanf( "%d", &stack1[i] );
    top1    = ______ (1)______;
    top2    = ______ (2)______;
    for ( j = 0; j < m; j++ )
    {
        scanf( "%d", &i );
        while ( i < top1 - 1 )
        {
            top1--;
            ______( 3 ) ______;
            top2++;
        }
        while ( i > top1 - 1 )
        {
            top2--;
            ______( 4 ) ______;
            top1++;
        }
        clearstack();
        printf( "%d\\
", stack1[______( 5 ) ______] );
    }
    return(0);
}
  1. ①处应填( ){{ select(1) }}
  • 0
  • n
  • 1
  • -1
  1. ②处应填( ){{ select(2) }}
  • 1
  • 2
  • n
  • 0
  1. ③处应填( ){{ select(3) }}
  • stack2[top2]=stack1[top1]
  • top1=top2
  • stack2[top1]=stack1[top1]
  • stack2[top1]=stack1[top2]
  1. ④处应填( ){{ select(4) }}
  • stack1[top1]=stack2[top1]
  • stack1[top2]=stack2[top1]
  • stack1[top1]=stack2[top2]
  • stack1[top2]=stack2[top2]
  1. ⑤处应填( ){{ select(5) }}
  • top1
  • top2
  • top1-1
  • top2-1