最近學習數據結構,一開始接觸感覺好難,頹廢了一段時間,後來又重新翻開學習,突然感覺到很大的興趣。對這些代碼的運用都有了 一些新的認識。下面簡單的講述下最新學到的順序棧,不知道大家學習的時候會不會有感覺,書上寫的那麼簡單,但是我寫的都是不對,不是這裡有錯就是那裡有錯,最後還是攻克了,心理慢慢地成就感。
題目大概:輸入一串整數,如果 該數不等於-1,就進棧,若是等於-1,則輸出棧頂整數並出棧。同時算法給出應對異常的情況。
代碼實現
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAX 100
typedef int ElemType;
typedef struct
{
ElemType *top;
ElemType *base;
int stacksize;
}SqStack;
//給予棧初始化
bool InitStack(SqStack &S)
{
S.base=new ElemType[MAX];
if(!S.base) return false;
S.top=S.base;
S.stacksize=MAX;
return true;
}
//輸出棧頂元素
char GetTop(SqStack S)
{
if(S.top!=S.base)
printf("獲取棧頂數:%d\n",*(S.top-1));
}
//入棧
bool Pop(SqStack &S,ElemType &e)
{
if(S.top==S.base) return false;
e=*--S.top;
printf("出棧數:%d\n",e);
return true;
}
//出棧
bool Push(SqStack &S,ElemType &e)
{
if(S.top-S.base==S.stacksize) return false;
if(e==-1)
{
GetTop(S);
Pop(S,e);
return true;
}
*S.top++=e;
printf("入棧數:%d\n",e);
return true;
}
//判斷是否為空
int IsEmpty(SqStack S)
{
if(S.top==S.base) return 1;
else
return 0;
}
//判斷是否為滿
int IsFull(SqStack S)
{
if(S.top-S.base==S.stacksize) return 1;
else
return 0;
}
//銷毀
int DestroyStack( SqStack &S )
{
if( S.base )
{
delete S.base ;
S.stacksize = 0;
S.base = S.top = NULL;
}
return 1;
}
主函數部分
int main()
{
SqStack s;
ElemType e;
int i;
printf("(1)初始化\n");
InitStack(s);
printf("初始化是否成功:%s\n",(InitStack(s)?"是":"否"));
printf("(2)PUSH:\n");
for( i = 0; i < 5;i++ )
{
e=i;
Push( s, e );
}
printf("(3)測試:當輸入數為-1時\n");
e=-1;
Push( s, e );
printf("(4)輸出棧是否為空為 %s\n",(IsEmpty(s)?"空":"非空"));
printf("(5)輸出棧是否為滿為 %s\n",(IsFull(s)?"滿":"非滿"));
printf("(6)銷毀棧 %s\n",(DestroyStack(s)?"成功":"失敗"));
return 0;
}
問題:
1.base opera of -> has non-pointer type ...
有時候編譯軟件在用->就報錯,但是修改為S.base就為正確了
2.還有 一點符號問題&與*是有區別了,注意看
3.剩下的問題就不列舉了