上一次用鍊結串列做過,不過說到堆疊,C語言最好還是用一般陣列寫
有鑑於此,所以這次我用陣列玩看看。
首先,要說明一下。堆疊的建構有幾個一定要出現的,比如說create功能(初始化堆疊)、push功能(置入)、pop功能(取出/刪除)、以及很重要的IsEmpty(判斷是否為空堆疊,沒有這個pop會出錯);除了這四個以外,如果用陣列來做,就一定要考慮到陣列空間是否已滿。如果用鍊結串列來做,因為空間是「需要才加上去」,空間配置是可動的,所以IsFull這個功能可以不要沒關係,但如果是陣列,沒有這個功能,恐怕就會有溢出問題。
#include <iostream>
using namespace std;
const int size = 10;//堆疊大小為十個空間
int top = -1;//一開始的時候堆疊頭標示為-1,表示是空堆疊
void get_top(int t)//用來改變傳回堆疊頭的位置
{
top = t;
}
void create(int stack[size])//初始化功能
{
for(int i=0; i<size; i++)
{
stack[i]=0;
}//初始化每個位置為零
get_top(-1);//復歸堆疊頭
}
int isempty(int t)//空堆疊判別功能
{
if(t < 0){ cout<<"stack is EMPTY!"<<endl; return -1;}
cout<<"stack is NOT EMPTY!"<<endl; return 0;
}//如果堆疊為空,傳回-1,不為空傳回0
int isfull(int t)//判別堆疊內容是否已滿
{
if (t==(size-1)){ cout<<"stack is FULL"<<endl; return 1;}
return 0;
}//如果堆疊滿了傳回 1,沒滿傳回0
int push(int stack[size], int t, int item)//置入元素
{
if(isfull(t)==1){ return 0;}//假設陣列滿了,跳出
else
{
stack[t+1]=item;
get_top(t+1);
return 0;
}
}
int pop(int stack[], int t)//取出元素功能
{
if(isempty(t)==-1){ return 0;}//先判斷他是不是空堆疊
else
{
stack[t]=0;
get_top(t-1);
return 0;
}
}
void main()
{
int arr[size]={0};
create(arr,top);
push(arr,top,10);
push(arr,top,11);
push(arr,top,12);
push(arr,top,13);
push(arr,top,14);
push(arr,top,15);
push(arr,top,16);
push(arr,top,17);
push(arr,top,18);
push(arr,top,19);
pop(arr,top);
for(int i=0; i<size; i++)
{
cout<<arr[i]<<"\t";
}
cout<<top<<endl;
system("pause");
}2