C語言實現棧(基於陣列)
阿新 • • 發佈:2018-12-23
棧是一種操作受限的資料結構,只允許從一段操作,而且先進後出(FILO first in last out)這裡將棧的操作封裝在C語言的標頭檔案裡
實現棧的程式碼如下
#include<stdbool.h> #define maxsize 10 typedef int datatype; //Sequence Stack 實現順序棧,使用陣列來實現 struct stack { datatype data[maxsize]; int top; }; typedef struct stack Stack; //建立棧 Stack s; //初始化棧 void init() { s.top=-1; } //判斷棧是否為空 bool Empty() { if(s.top==-1) { return true; } else { return false; } } //判斷棧是否已滿了 bool full() { if(s.top==maxsize-1) { return true; } else { return false; } } //入棧 void Push(datatype element) { if(!full()) { s.top++; s.data[s.top]=element; } else { printf("棧滿\n"); } } //出棧 void Pop() { if(!Empty()) { s.top--; } else { printf("棧空\n"); } } //取棧頂元素 datatype Top() { if(!Empty()) { return s.data[s.top]; } else { printf("棧空\n"); } } //銷燬棧 void Destroy() { s.top=-1; }
測試棧的程式碼如下:
#include<stdio.h> #include "SequenceStack.h" int main() { int i=0; // struct stack s; //初始化棧 printf("\n###########初始化棧###########\n"); init(); printf("----------------------------------"); //入棧操作 printf("\n###########入棧操作###########\n"); for(i=0;i<=10;i++) { Push(i); } printf("----------------------------------"); printf("\n###########取棧頂元素###########\n"); printf("%d\n",Top()); printf("----------------------------------"); //出棧操作 printf("\n###########出棧操作###########\n"); for(i=0;i<=10;i++) { Pop(); } printf("----------------------------------"); printf("\n###########取棧頂元素###########\n"); Top(); printf("----------------------------------"); printf("\n###########銷燬棧###########\n"); Push(10); Destroy(); Top(); }
這樣實現棧,巨集定義處maxsize表示棧的大小,方便以後修改,typedef也是同樣的效果,可以隨時改變資料型別。
在操作棧的時候也只要用到push、pop、top、等方法就可以了
這樣的棧有一個明顯的缺點,是棧被定義在標頭檔案裡,這樣使用者只能使用一個棧,無法同時建立兩個棧,考慮到這一點,對棧的程式碼做出修改
實現棧的程式碼
#include<stdbool.h> #define maxsize 10 typedef int datatype; //Sequence Stack 實現順序棧,使用陣列來實現 struct stack { datatype data[maxsize]; int top; }; typedef struct stack Stack; //建立棧 // Stack s; //初始化棧 void init(Stack *s) { s->top=-1; } //判斷棧是否為空 bool Empty(Stack *s) { if(s->top==-1) { return true; } else { return false; } } //判斷棧是否已滿了 bool full(Stack *s) { if(s->top==maxsize-1) { return true; } else { return false; } } //入棧 void Push(Stack *s,datatype element) { if(!full(s)) { s->top++; s->data[s->top]=element; } else { printf("棧滿\n"); } } //出棧 void Pop(Stack *s) { if(!Empty(s)) { s->top--; } else { printf("棧空\n"); } } //取棧頂元素 datatype Top(Stack *s) { if(!Empty(s)) { return s->data[s->top]; } else { printf("棧空\n"); } } //銷燬棧 void Destroy(Stack *s) { s->top=-1; }
測試棧的程式碼
#include<stdio.h>
#include "SequenceStack1.0.h"
int main()
{
int i=0;
Stack p;
Stack *s;
s=&p;
// struct stack s;
//初始化棧
printf("\n###########初始化棧###########\n");
init(s);
printf("----------------------------------");
//入棧操作
printf("\n###########入棧操作###########\n");
for(i=0;i<=10;i++)
{
Push(s,i);
}
printf("----------------------------------");
//取棧頂元素
printf("\n###########取棧頂元素###########\n");
printf("%d\n",Top(s));
printf("----------------------------------");
//出棧操作
printf("\n###########出棧操作###########\n");
for(i=0;i<=12;i++)
{
Pop(s);
}
printf("----------------------------------");
//取棧頂元素
printf("\n###########取棧頂元素###########\n");
Top(s);
printf("----------------------------------");
//銷燬棧
printf("\n###########銷燬棧###########\n");
Push(s,10);
Destroy(s);
Top(s);
}
這裡可以在主函式中自己定義棧,從而同時實現多個棧,但是這樣的棧還是大小固定的,每次修改maxsize很麻煩,所以想到malloc函式,對棧的程式碼做了進一步的修改
實現棧的程式碼
#include<stdbool.h>
#include<stdlib.h>
#define maxsize 10
typedef int datatype;
//Sequence Stack 實現順序棧,使用陣列來實現
struct stack
{
datatype *data;
int top;
};
typedef struct stack Stack;
//建立棧
int realsize=maxsize;
// Stack s;
//初始化棧
void init(Stack *s)
{
s->data = (datatype *)malloc(sizeof(datatype)*maxsize);
s->top=-1;
}
//判斷棧是否為空
bool Empty(Stack *s)
{
if(s->top==-1)
{
return true;
}
else
{
return false;
}
}
//判斷棧是否已滿了
void full(Stack *s)
{
if(s->top==realsize-1)
{
realsize++;
s->data=(datatype *)realloc(s->data,realsize*sizeof(datatype));
}
}
//入棧
void Push(Stack *s,datatype element)
{
full(s);
s->top++;
s->data[s->top]=element;
}
//出棧
void Pop(Stack *s)
{
if(!Empty(s))
{
s->top--;
}
else
{
printf("棧空\n");
}
}
//取棧頂元素
datatype Top(Stack *s)
{
if(!Empty(s))
{
return s->data[s->top];
}
else
{
printf("棧空\n");
}
}
//銷燬棧
void Destroy(Stack *s)
{
s->top=-1;
free(s->data); //釋放堆上記憶體
}
測試棧的程式碼
#include<stdio.h>
#include "DynamicStack1.0.h"
int main()
{
int i=0;
Stack p;
Stack *s;
s=&p;
// struct stack s;
//初始化棧
printf("\n###########初始化棧###########\n");
init(s);
printf("----------------------------------");
//入棧操作
printf("\n###########入棧操作###########\n");
for(i=0;i<=10;i++)
{
Push(s,i);
}
printf("----------------------------------");
//取棧頂元素
printf("\n###########取棧頂元素###########\n");
printf("%d\n",Top(s));
printf("----------------------------------");
//出棧操作
printf("\n###########出棧操作###########\n");
for(i=0;i<=12;i++)
{
Pop(s);
}
printf("----------------------------------");
//取棧頂元素
printf("\n###########取棧頂元素###########\n");
Top(s);
printf("----------------------------------");
//銷燬棧
printf("\n###########銷燬棧###########\n");
Push(s,10);
Destroy(s);
Top(s);
}
這樣就可以實現無限大小的棧了,這裡realloc之後的指標,在free的時候容易出錯