《棧的基本操作》


/*
對棧的一些基本操作:
1,棧的創建。 CreatStack(SqStack &s)
2,壓棧操作。 Push(SqStack &s,SElemType &e)
3,得到棧頂的元素。 GetTop(SqStack s,SElemType &e)
4,出棧操作。(若棧不為空,則刪除棧頂元素,並用e2返回其值) Pop(SqStack &s,SElemType &e)
5,計算棧的長度。 StackLength(SqStack s)
6,清空一個棧。 ClearStack(SqStack &s)
7,銷毀一個棧。 DestroyStack(SqStack &s)
8,依次輸出棧低到棧頂的元素。PrintSatck(SqStack s)
*/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define STACK_INIT_SIZE 100 //棧存儲空間初始分配量
#define STACKINCREMENT 10 //存儲空間分配增量
typedef int Status; //函數類型
typedef int SElemType; //數據元素類型

typedef struct
{
SElemType *top;
SElemType *base;
SElemType stacksize;
}SqStack;

//棧的創建
Status CreatStack(SqStack &s)
{
s.base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!s.base) exit(OVERFLOW);
s.top = s.base;
s.stacksize = STACK_INIT_SIZE;
return OK;
}

//壓棧操作
Status Push(SqStack &s,SElemType e)
{
if(s.top - s.base >= s.stacksize)
//棧滿,追加空間
{ s.base = (SElemType *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!s.base)
exit(OVERFLOW);
s.top = s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top = e;
s.top++;
return OK;
}

//得到棧頂的元素
Status GetTop(SqStack s,SElemType &e)
{
if(s.top == s.base)
return ERROR;
e = *(s.top - 1);
return e;
}

//出棧操作
Status Pop(SqStack &s,SElemType &e)
{
if(s.top == s.base)
return ERROR;
--s.top;
e = *s.top;
return e;
}

//計算棧的長度
Status StackLength(SqStack s)
{
return (s.top - s.base);
}

//清空一個棧
Status ClearStack(SqStack &s)
{
s.top = s.base;
return OK;
}

//銷毀一個棧
Status DestroyStack(SqStack &s)
{
int i,len;
len = s.stacksize;
for(i=0;i<len;i++)
{
free(s.base);
s.base++;
}
s.top = s.base = NULL;
s.stacksize = 0;
return OK;
}

//依次輸出棧低到棧頂元素
void PrintSatck(SqStack s)
{}

//主函數
int main()
{
SqStack s;
int e;

//調用CreatStack函數,創建一個空棧
CreatStack(s);
printf("棧已創建好!\n");

//調用Push函數,進行壓棧操作
printf("請輸入要壓入棧的數據:\n");
scanf("%d",&e);
while(e!=9999)
{
Push(s,e);
printf("input data ending(9999)\n");
scanf("%d",&e);
}
printf("棧的長度為:%d",StackLength(s));
printf("\n");

//調用GetTop函數
printf("棧頂的元素是:%d",GetTop(s,e));
printf("\n");

//調用Pop函數,刪除棧頂的元素
printf("刪除的棧頂的元素是:%d",Pop(s,e));
printf("\n");

//調用StackLength函數,計算棧的長度
printf("棧的長度為:%d",StackLength(s));
printf("\n");

//調用ClearStack函數,清空一個棧
ClearStack(s);
printf("棧已清空\n");

//調用DestroyStack函數,銷毀一個棧
//DestroyStack(s);
//printf("棧已銷毀\n");

//調用PrintStack函數依次輸出棧低到棧頂的元素
//PrintStack(s);
//printf("\n");

return 0;

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM