只允許在同一端點處進行插入或刪除的表結構成爲棧
插入的一端稱爲棧頂;另一端稱爲棧尾。
將元素放入棧是進棧,將元素取出成爲退棧。
特點:
- 棧是一種後進先出結構
- 又稱後進先出表(LIFO表)
分類:
- 順序棧
- 鏈式棧
一、順序棧
1.定義
#define EMPTY -1 //空棧的棧頂指針
const int m=1000;//預定的棧空間大小
int s[m];//定義順序棧
- 進棧退棧算法需要能夠配合
- 程序執行期間,降不定期的進棧、出棧
- 開始時,棧空,指針top的值等於EMPTY
2.進棧算法
int push(int s[],int &top,int x)//進棧函數
{
if(top==m-1)return 0;//表示棧滿,不能進棧
s[++top]=x;
return 1;//表示進棧成功
}
3.退棧算法
int pop(int s[],int &top,int &x)//退棧函數
{
if(top==EMPTY)return 0;//表示棧空,不能出棧
x=s[top--];
return 1;//表示出棧成功
}
4.兩個堆棧利用空間
typedef struct stack{
int a[N];
int top1,top2;
}stack;
stack s;
//top1位於最左側,top2位於最右側,如果top1==top2,則說明棧滿。
二、鏈式棧
1.進棧算法
int push(ptr &top,int x)
{
ptr p;
p=new snode;//申請結點
if(p==NULL)return 0;//申請失敗
p->data=x;//x進棧
p->next=top;//表頭插入法
top=p;//修改表頭指針
return 1;//進棧成功
}
2.出棧算法
int pop(ptr &top.int &x){
ptr p;
if(top==NULL)return 0;//退棧不成功
x=top->data;
p=top;//表頭刪除法
top=top->next;
free(p);
return 1;//退棧成功
}
三、棧的應用——程序中斷
中斷是操作系統實現程序“併發執行”的重要技術。當程序要求輸入輸出數據時,主機向外設發出輸入輸出命令,由外設完成具體的輸入輸出操作。由於主機速度比外設速度快得多,爲了提高主機工作效率,主機在發出輸入輸出命令後,不是空等外設傳輸完畢在工作,而是繼續運行系統中的其他程序。
中斷:一個程序執行期間,被其他程序所打斷。
斷點:打斷的地方
現場:被打斷的程序當前執行情況
棧架:一個現場
保護現場和回覆現場,嵌套中斷的現場需要層層保護。必須“後進先出”——棧