一個菜鳥的資料結構學習之路(棧篇)
阿新 • • 發佈:2019-01-28
棧的基本操作如下:
- 相關結構體:
typedef int status;
typedef struct
{
SElemType *base; //在棧建立之前和銷燬之後,base的值為NULL
SElemType *top; //棧頂指標
int stacksize; //當前已分配的儲存空間,以元素為單位
}SqStack;
- 相關巨集定義:
# define STACK_INIT_SIZE 100
# define STACKINCREMENT 10
# define OK 1
# define ERROR
- 相關函式宣告:
Status InitStack(SqStack &S) ; /*構造一個空棧S*/
Status DestoryStack(SqStack &S); /*銷燬棧S,S不再存在*/
Status ClearStack(SqStack &S); /*把棧S置為空棧*/
Status StackLength(SqStack S); /*返回棧S的元素個數,即棧長*/
Status GetTop(SqStack S,SElemType &e);/*若棧不為空,則用e返回S的棧頂元素,成功則返回OK,否則返回ERROR*/
Status Push(SqStack &S,SElemType &e); /*在棧S的棧頂插入元素e為新的棧頂元素*/
Status Pop(SqStack &S,SElemType &e); /*若棧不為空,則刪除棧頂元素,用e返回此值,成功則返回OK,否則返回ERROR*/
- 構造空棧S:
Status InitStack(SqStack &S); /*構造一個空棧S*/
{
S.base = (SElemType *)malloc(sizeof(SElemType)*STACK_INIT_SIZE); //分配記憶體
if(!S.base)
exit(ERRORFLOW);
S.top = S.base; //將base置於棧頂
S.stacksize = STACKINCREMENT; //定義棧S的長度
return OK;
}
- 銷燬棧S:
Status DestoryStack(SqStack &S); /*銷燬棧S,S不再存在*/
{
S.top = S.base = NULL;
return OK;
}
- 把棧S置空:
Status ClearStack(SqStack &S); /*把棧S置為空棧*/
{
S.top = S.base; //棧頂為空
stacksize = 0; //已分配空間置0
}
- 棧長:
Status StackLength(SqStack S); /*返回棧S的元素個數,即棧長*/
{
return stacksize;
}
- 用e返回棧頂元素:
Status Push(SqStack &S,SElemType &e); /*在棧S的棧頂插入元素e為新的棧頂元素*/
{
if(S.top - S.base >= S.stacksize) //棧已滿,追加記憶體分配
{
S.base = (SElemType *)relloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType));
if(!S.base)
exit(OVERFLOW); //記憶體分配失敗
S.top = S.base + S.stacksize; //棧頂地址
S.stacksize = S.stacksize + STACKINCREMENT; //當前棧的空間
}
*S.top++ = e; //將e插入棧頂
return OK;
}
- 在棧頂插入元素e:
Status Push(SqStack &S,SElemType &e); /*在棧S的棧頂插入元素e為新的棧頂元素*/
{
if(S.top - S.base >= S.stacksize) //棧已滿,追加記憶體分配
{
S.base = (SElemType *)relloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType));
if(!S.base)
exit(OVERFLOW); //記憶體分配失敗
S.top = S.base + S.stacksize; //棧頂地址
S.stacksize = S.stacksize + STACKINCREMENT; //當前棧的空間
}
*S.top++ = e; //將e插入棧頂
return OK;
- 退棧並用e返回被刪除的棧頂元素:
Status Pop(SqStack &S,SElemType &e); /*若棧不為空,則刪除棧頂元素,用e返回此值,成功則返回OK,否則返回ERROR*/
{
if(S.base == S.top)
return ERROR;
e = *--S.top; //把棧頂元素的值賦給e
return OK;
}
- 主函式:
int main(void)
{
SqStack S;
InitStack(&S);
int choice;
SElemType e;
while(1)
{
printf("*************************************************\n");
printf("*[1]棧的長度 [2]棧頂插入新元素 *\n");
printf("*[3]將棧S清空 [4]銷燬棧S *\n");
printf("*[5]退棧並返回其值 [6]獲得棧頂元素 *\n");
printf("* [0]退出 *\n");
printf("*************************************************\n");
scanf("%d",&choice);
switch(choice)
{
case 0: break;
case 1: StackLength(S);break;
case 2: scanf("%d",&e);Push(&S,e);break;
case 3: ClearStack(&S);break;
case 4: DestoryStack(&S);break;
case 5: Pop(&S,e);break;
case 6: GetTop(s,e);break;
}
}
return 0;
}