国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C/C++數(shù)據(jù)結(jié)構(gòu)---在一個數(shù)組中實現(xiàn)兩個堆棧(PTA)

這篇具有很好參考價值的文章主要介紹了C/C++數(shù)據(jù)結(jié)構(gòu)---在一個數(shù)組中實現(xiàn)兩個堆棧(PTA)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

個人主頁

仍有未知等待探索_數(shù)據(jù)結(jié)構(gòu),C語言疑難,小項目-CSDN博客

專題分欄---數(shù)據(jù)結(jié)構(gòu)

數(shù)據(jù)結(jié)構(gòu)_仍有未知等待探索的博客-CSDN博客

目錄

一、前言? ? ? ??

二、題目

要求

函數(shù)接口定義

裁判測試程序樣例

輸入樣例?

輸出樣例?

三、分析?

1.棧的特點

2.題目分析?

3.棧的創(chuàng)建

4.入棧

5.出棧?

四、總代碼


一、前言? ? ? ??

?今天寫老師留的PTA的作業(yè)時,遇到一個非常不一樣的棧,我覺得應該把它寫出來,讓大家眼前一亮 ,擴展一下視野,并且也能讓我有更深層次的理解!

二、題目

要求

本題要求在一個數(shù)組中實現(xiàn)兩個堆棧。

函數(shù)接口定義:

Stack CreateStack( int MaxSize ); //棧的創(chuàng)建
bool Push( Stack S, ElementType X, int Tag );//入棧 
ElementType Pop( Stack S, int Tag );//出棧

其中Tag是堆棧編號,取1或2;MaxSize堆棧數(shù)組的規(guī)模;

Stack結(jié)構(gòu)定義如下:?

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

注意:如果堆棧已滿,Push函數(shù)必須輸出“Stack Full”并且返回false;如果某堆棧是空的,則Pop函數(shù)必須輸出“Stack Tag Empty”(其中Tag是該堆棧的編號),并且返回ERROR。

裁判測試程序樣例

#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 );//棧的創(chuàng)建
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
Push 1 1
Pop 2
Push 2 11
Push 1 2
Push 2 12
Pop 1
Push 2 13
Push 2 14
Push 1 3
Pop 2
End

輸出樣例?

Stack 2 Empty
Stack 2 is Empty!
Stack Full
Stack 1 is Full!
Pop from Stack 1: 1
Pop from Stack 2: 13 12 11

三、分析?

在寫之前,我們要明白,什么是在一個數(shù)組里面實現(xiàn)兩個堆棧。堆棧好理解,就是線性表的一種特殊的形式。

棧,不像正常的順序表那樣能完成增刪改查的操作,棧只能進行入棧和出棧的操作。雖然操作的形式變少了,但是棧也有自己的優(yōu)點,他的入棧和出棧的時間復雜度為O(1),相比正常的順序表快了不少。

1.棧的特點

1、后進先出? ? ?2、入棧和出棧的時間復雜度為O(1)

一般棧的數(shù)據(jù)類型為:

#define MaxSize 1000
typedef int elemtype; 
struct LNode
{
    elemtype data[MaxSize];
    int top;棧頂指針,存儲的是棧頂上的下標
}

2.題目分析?

根據(jù)題目所說的一個數(shù)組開辟兩個堆棧,如圖所示:

C/C++數(shù)據(jù)結(jié)構(gòu)---在一個數(shù)組中實現(xiàn)兩個堆棧(PTA),PTA,數(shù)據(jù)結(jié)構(gòu),c語言

棧頂指針Top1,Top2的初始位置分別為-1,和MaxSize。題目中的Tag變量存的是堆棧的編號,當Tag==1時,指的是棧頂指針為Top1的棧;Tag==2時,指的是棧頂指針為Top2的棧。

其中Top1為棧頂指針的棧是個正常的棧,而Top2為棧頂指針的棧是一個反向的棧,入棧的時候,要注意棧頂指針往左移,出棧的時候,棧頂指針往右移。

要注意棧滿的時候的條件:Top1+1==Top2,如圖所示:

C/C++數(shù)據(jù)結(jié)構(gòu)---在一個數(shù)組中實現(xiàn)兩個堆棧(PTA),PTA,數(shù)據(jù)結(jié)構(gòu),c語言

3.棧的創(chuàng)建

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

根據(jù)題目給的棧的類型可知:首先,需要給棧類型開辟空間、指針Data開辟空間。

然后需要給兩個不同的棧頂變量賦初值。不要忘了,棧類型里面還有MaxSize變量也要賦初值。

Stack CreateStack(int MaxSize)
{
    Stack s = (Stack)malloc(sizeof(struct SNode));
    s->Data = (int*)malloc(sizeof(ElementType) * MaxSize);
    s->Top1 = - 1;
    s->Top2 = MaxSize;
    s->MaxSize = MaxSize;
    return s;
}

4.入棧

在入棧前要先判斷一下棧是否已經(jīng)滿了,滿了的條件根據(jù)上述講解,可知S->Top1+1 == S->Top2。如果沒滿的話,根據(jù)Tag的來分辨是棧頂指針是Top1還是棧頂指針是Top2的。最后先棧頂指針Top1++或Top2--;再賦初值。

bool Push(Stack S, ElementType X, int Tag)
{
    if (S->Top1+1 == S->Top2)
    {
        printf("Stack Full\n");
        return false;
    }
    if (Tag == 1)
    {
         S->Top1++;
         S->Data[S->Top1] = X;
    }
    if(Tag==2)
    {
        S->Top2--;
        S->Data[S->Top2] = X;
    }
    return true;
}

5.出棧?

出棧也是一樣的,先判斷棧是否為空,如果不為空,那就棧頂指針Top1--或Top2++

ElementType Pop(Stack S, int Tag)
{
    if (Tag == 1)
    {
        if (S->Top1 == -1)       
        {
            printf("Stack %d Empty\n", Tag);
            return ERROR;
        }
        return S->Data[S->Top1--];   
    }

    if (Tag == 2)
    {
        if (S->Top2 == S->MaxSize) 
        {
            printf("Stack %d Empty\n", Tag);
            return ERROR;
        }
        return S->Data[S->Top2++];
    }
}

四、總代碼

Stack CreateStack(int MaxSize)
{
    Stack s = (Stack)malloc(sizeof(struct SNode));
    s->Data = (int*)malloc(sizeof(ElementType) * MaxSize);
    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->Top1++;
         S->Data[S->Top1-1] = X;
    }
    if(Tag==2)
    {
        S->Top2--;
        S->Data[S->Top2+1] = X;
    }
    return true;
}
ElementType Pop(Stack S, int Tag)
{
    if (Tag == 1)
    {
        if (S->Top1 == -1)       
        {
            printf("Stack %d Empty\n", Tag);
            return ERROR;
        }
        return S->Data[S->Top1--];   
    }

    if (Tag == 2)
    {
        if (S->Top2 == S->MaxSize) 
        {
            printf("Stack %d Empty\n", Tag);
            return ERROR;
        }
        return S->Data[S->Top2++];
    }
}

C/C++數(shù)據(jù)結(jié)構(gòu)---在一個數(shù)組中實現(xiàn)兩個堆棧(PTA),PTA,數(shù)據(jù)結(jié)構(gòu),c語言

謝謝大家的支持!?文章來源地址http://www.zghlxwxcb.cn/news/detail-715017.html

到了這里,關于C/C++數(shù)據(jù)結(jié)構(gòu)---在一個數(shù)組中實現(xiàn)兩個堆棧(PTA)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包