РТА 6-13 достижения двух стеков (20 минут) в массиве

Эта проблема требует двух стеков, реализованных в массиве.

Функция определения интерфейса:

Stack CreateStack( int MaxSize );
bool Push( Stack S, ElementType X, int Tag );
ElementType Pop( Stack S, int Tag );

Метка , где число стека берется 1 или 2; массив размера стека MaxSize;
структура стека определяется следующим образом :

typedef int Position;
struct SNode {
    ElementType *Data;
    Position Top1, Top2;
    int MaxSize;
};
typedef struct SNode *Stack;

Примечание: Если стек заполнен, должна выдавать на выходе функции Нажмите «Стек Full» и возвращение ложное, если стек пуст, то функция вывода должна Pop «Stack Tag Empty» (где Tag этого числа стеки), и возвращает ошибку.

Арбитр тестовая программа Пример:

#include <stdio.h>
#include <stdlib.h>

#define ERROR 1e8
typedef int ElementType;
typedef enum { push, pop, end } Operation;
typedef enum { false, true } bool;
typedef int Position;
struct SNode {
    ElementType *Data;
    Position Top1, Top2;
    int MaxSize;
};
typedef struct SNode *Stack;

Stack CreateStack( int MaxSize );
bool Push( Stack S, ElementType X, int Tag );
ElementType Pop( Stack S, int Tag );

Operation GetOp();  /* details omitted */
void PrintStack( Stack S, int Tag ); /* details omitted */

int main()
{
    int N, Tag, X;
    Stack S;
    int done = 0;

    scanf("%d", &N);
    S = CreateStack(N);
    while ( !done ) {
        switch( GetOp() ) {
        case push: 
            scanf("%d %d", &Tag, &X);
            if (!Push(S, X, Tag)) printf("Stack %d is Full!\n", Tag);
            break;
        case pop:
            scanf("%d", &Tag);
            X = Pop(S, Tag);
            if ( X==ERROR ) printf("Stack %d is Empty!\n", Tag);
            break;
        case end:
            PrintStack(S, 1);
            PrintStack(S, 2);
            done = 1;
            break;
        }
    }
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:
5
Нажмите 1 1
Pop 2
Нажмите 2 11
Нажмите 1 2
Нажмите 2 12
Pop 1
Нажмите 2 13
Нажмите 2 14
Нажмите 1 3
Pop 2
End
输出样例:
Stack 2 Пустой
Stack 2 пуста!
Стек Full
Stack 1 является полным!
Поп из стека 1: 1
Попа из стека 2: 13 12 11

Вэе после прочтения названия смотреть невежественные силы, начали думать , что два вершина стеки после ,,, по напоминающим начальникам все должны знать два дна стеки. Описанные в учебниках стека массива используется как индекс позиции 0 EMMM нижней части стека ,
что намного проще, в функции CreateStack в хорошем состоянии, определяется после набора TOP1 к -1, TOP2 MaxSize это множество, так как компилятор представляет собой с, поэтому пространство динамического приложения не может быть использовано , когда новые новые, использовать функцию таНоса, космические коды в приложении представляет собой динамический массив:

s->Data=(int *)malloc(MaxSize*sizeof(int));//MaxSize为数组大小

В функции нажимной, главное , является ли полный спектр решения, если Top1 + 1 == TOP2, а затем доказать стек массив заполнен
в поп - функции (эта функция является наиболее раздражающим), прочитал название мне делать , если найти не знаю после того, как успешно удален , что я хочу вернуться. , После перехода большого кода брата , чтобы знать , если вы хотите удалить успешное возвращение удалены (перед) верхним элементом (я злюсь, ручной Paizhuo)

(Спасибо также в дополнение к функции двух тяжеловесов не дали название)

Operation GetOp()
{
    char Push[] = "Push";
    char Pop[] = "Pop";
    char End[] = "End";
    char s[100];
    scanf("%s", s);

    if (strcmp(Push, s) == 0)return push;
    if (strcmp(Pop, s) == 0)return pop;
    if (strcmp(End, s) == 0)return end;
}
void PrintStack(Stack S, int Tag)
{
    printf("Pop from Stack %d:", Tag);
    if (Tag == 1){
        while (S->Top1 != -1){
            printf(" %d", S->Data[S->Top1--]);
        }
    }
    else {
        while (S->Top2 != S->MaxSize){
            printf(" %d", S->Data[S->Top2++]);
        }
    }
    putchar('\n');
}

А Вэй AC кода:

Stack CreateStack( int MaxSize )
{
    Stack s=(Stack)malloc(sizeof(struct SNode));
    s->Data=(int *)malloc(MaxSize*sizeof(int));
    s->Top1=-1;
    s->Top2=MaxSize;
    s->MaxSize=MaxSize;
    return s;
}
bool Push( Stack S, ElementType X, int Tag )
{
    if(S->Top1+1==S->Top2)
    {
        printf("Stack Full\n");
        return false;
    }
    if(Tag==1)
    {
        S->Data[++S->Top1]=X;
    }
    else
        S->Data[--S->Top2]=X;
    return true;
}
ElementType Pop( Stack S, int Tag )
{
    if((Tag==1&&S->Top1==-1)||(Tag==2&&S->Top2==S->MaxSize))
    {
        printf("Stack %d Empty\n",Tag);
        return ERROR;
    }
    if(Tag==1)
        return S->Data[S->Top1--];//返回新的栈顶元素
    else
        return S->Data[S->Top2++];
    return 1;
}
Опубликовано 32 оригинальные статьи · вона похвала 12 · просмотров 1366

рекомендация

отblog.csdn.net/qq_18873031/article/details/103218145