個人主頁
仍有未知等待探索_數(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ù)組開辟兩個堆棧,如圖所示:
棧頂指針Top1,Top2的初始位置分別為-1,和MaxSize。題目中的Tag變量存的是堆棧的編號,當Tag==1時,指的是棧頂指針為Top1的棧;Tag==2時,指的是棧頂指針為Top2的棧。
其中Top1為棧頂指針的棧是個正常的棧,而Top2為棧頂指針的棧是一個反向的棧,入棧的時候,要注意棧頂指針往左移,出棧的時候,棧頂指針往右移。
要注意棧滿的時候的條件:Top1+1==Top2,如圖所示:
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++];
}
}
文章來源:http://www.zghlxwxcb.cn/news/detail-715017.html
謝謝大家的支持!?文章來源地址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)!