**棧是一種操作受限制的線性表,太多官方的話我也不說了,我們都知道棧元素是先進后出的,它有兩種存儲結構,分別是順序存儲結構和鏈式存儲結構。
**今天我先記一下順序存儲結構,后面我會加上鏈式存儲結構的。
**我看到別人的順序棧都是用別的方式來寫的,我現在這里用的是一維數組,也就是用數組模擬。由於要用到bool型,所以我直接用c++來寫,大家可以相應改成C語言的版本,並不難。
**順序棧的操作 無非是基本的八個,分別是初始化,出棧,入棧,是否為空,是否為滿,取棧頂元素,取有效元素個數,遍歷。
**如果用靜態數組模擬的話,不需要銷毀棧,(我個人覺得 如果有誤,請指正) 清空的話,直接初始化就行。順序棧的示意圖如下:
不多說了,直接給代碼參考:
在這里我用拼音來代替函數,讓新手看得明白一點,我這里用的是結構體來生成一個棧,這個棧有一百個格子,還有一個top指針,大家結合示意圖來看就會很形象的。
# include<iostream>
using namespace std;
typedef struct
{
int d[100];//定義一個長度為100的一維數組這里可以隨便設置長度
int top;//棧頂指針
} Stack;
void chushihua(Stack * s);//初始化一個棧
bool em(Stack * s);//判斷是否為空
bool full(Stack * s);//判斷是否為滿
bool push(Stack * s,int a);//入棧
bool pop(Stack * s,int *a);//出棧
bool ding(Stack * s,int *a);//取棧頂元素
int len(Stack * s);//取有效元素個數
void bianli(Stack * s);//遍歷
*****************************************************************
函數部分:
*****初始化一個棧*****
void chushihua(Stack * s);
{
s->top=-1; //結合示意圖讓top為-1 就是初始化這個棧
}
*****判斷是否為空 *****
bool em(Stack * s)
{
if(-1==s->top)
return true;
else
return false;
}
*****判斷是否為滿 *****
bool full(Stack * s)
{
if(99==s->top)//這里是因為數組的下標為零 所以對於一百來說 99就是最后一個“格子”
return true;
else
return false;
}
*****入棧*****
bool push(Stack * s,int a)
{
if(full(s)) //滿了就不能入棧
return false;
else
{
s->top++; //結合圖 指針先加
s->d[s->top]=a;// 再把數據存進對應的“格子”
return true;
}
}
*****出棧*****
bool pop(Stack * s,int *a)
{
if(em(s))// 空的當然不能出棧
return false;
else
{
*a=s->d[s->top]; //把棧頂元素 付給 變量
s->top--; //指針減一
return true;
}
}
*****取棧頂元素*****
這里只是取棧頂元素 不對棧有任何操作
bool ding(Stack * s,int *a)
{
if(em(s)) //同理 空棧沒有元素 就不行
return false;
else
{
*a=s->d[s->top]; // 把棧頂的元素賦值即可
return true;
}
}
*****取有效元素長度*****
由圖我們可知,指針+1就是有效元素長度了
int len(Stack * s)
{
return s->top+1;
}
*****遍歷*****
void bianli(Stack * s)
{
int i;
while(!em(s))//當不為空棧
{
pop(s,&i); //我們就出棧並賦值
cout<<i<<" "; // 打印
}
cout<<endl;//這是相當於C語言中的換行
}
*****************************************************************
主函數部分(測試)
int main(void)
{
Stack s;
int a,c;
chushihua(&s);
push(&s,1);
push(&s,2);
push(&s,3);
push(&s,4);
push(&s,5);
ding(&s,&a);
cout<<"有效長度為:"<<len(&s)<<" 棧頂元素為 "<<a<<endl;
bianli(&s);
return 0;
}
如圖:
以上就是用數組模擬順序棧的過程,如果有什么問題或者bug,請在下方評論,我目前會天天上論壇的。