Manchester


私信TA

用户名:wenyajie

访问量:312209

签 名:

在历史前进的逻辑中前进,这个逻辑就是人心向背的逻辑

等  级
排  名 1
经  验 62648
参赛次数 1
文章发表 188
年  龄 0
在职情况 学生
学  校 Xiamen University
专  业 计算机科学

  自我简介:

在历史前进的逻辑中前进,这个逻辑就是人心向背的逻辑

解题思路:
①:输入操作次数n

②:输入n次操作

③:P x :代表push操作,把x入栈

④:O :代表出栈操作

⑤:A :当栈不为空的时候,输出栈顶元素,栈为空的时候输出E


注意事项:

1):用字符串c[2]存放输入的P O A,虽然一次只存放一个字符,但是这样的好处是不用重复清空缓存区

         的回车

2):c[2]长度一定要为2,应为c[0]存放P O A,C[1]='\0', 若长度为1提交超时

3):一般Push操作要判断栈是否溢出(链栈除外),这题可以不用,因为开辟的栈大小为n,n步以内不会满

4):Pop操作一定要判断栈是否为空,空则不能top--,否则会栈下溢

5):这里栈顶指针top起始为-1,也可以为0,但要修改其余操作函数

6):每组数据完后要换行


参考代码:

#include <stdio.h>
#include <malloc.h>

typedef struct Stack_
{
    int    *Data;
    int    top;
    int    length;         /*空间长度,判断栈是否溢出使用*/
}*Stack, STACK;
void init_( Stack s );          /*初始化栈*/

void Push( int x, Stack s );    /*入栈*/

void Pop( Stack s );            /*出栈*/

int Gettop( Stack s );          /*获得栈顶元素*/

int StackEmpty( Stack s );      /*判断栈空*/

/*----------------------------------------------------------*/
int main()
{
    int    n;
    char    c[2];
    STACK    s;
    while ( scanf( "%d", &n ) != EOF )
    {
        getchar();              /*清空缓存区*/
        s.Data        = (int *) malloc( n * sizeof(int) );
        s.length    = n;    /*保存栈大小*/
        init_( &s );            /*栈初始化*/
        for ( int i = 0; i < n; i++ )
        {
            scanf( "%s", c );
            switch ( c[0] )
            {
            case 'P': { int x; scanf( "%d", &x ); Push( x, &s ); break; }

            case 'O': { Pop( &s ); break; }

            case 'A': { if ( StackEmpty( &s ) )     /*栈空输出E,不为空输出栈顶元素*/
                        printf( "E\n" );
                    else
                        printf( "%d\n", Gettop( &s ) );
                    break; }
            }
        }
        free( s.Data );                                 /*释放空间*/
        printf( "\n" );                                 /*每组数据空一行*/
    }
    return(0);
}


void init_( Stack s )                                           /*初始化栈*/
{
    s->top = -1;                                            /*栈顶指针这里规定从-1,开始*/
}


/*----------------------------------------------------------*/
void Push( int x, Stack s )                                     /*入栈操作*/
{
    if ( s->top + 1 >= s->length )
        return;                                         /*栈溢出*/
    else
        s->Data[++s->top] = x;                          /*因为top起始为-1,所以要先++,找到push位置*/
}


/*----------------------------------------------------------*/
void Pop( Stack s )                                             /*出栈*/
{
    if ( StackEmpty( s ) )                                  /*栈空则返回*/
        return;
    else                                                    /*不空则pop*/
        s->top--;
}


/*----------------------------------------------------------*/
int Gettop( Stack s )                                           /*获得栈顶元素*/
{
    int x = s->Data[s->top];
    return(x);
}


/*----------------------------------------------------------*/
int StackEmpty( Stack s ) /*判断栈空*/
{
    if ( s->top == -1 )
        return(1);
    else
        return(0);
}

别忘点赞哦-.-

 

0.0分

15 人评分

  评论区