首先明確,棧和隊列 是特殊的線性表。
棧(STL : STACK)
一、定義
棧是只能在一端進行插入和刪除操作的線性表
日常例子:
洗碗摞一堆; 書摞成一堆; 一些槍支子彈夾中子彈的操作方式等。
1.1一些基本概念
棧頂(top) 進行插入和刪除操作的一端
棧底(bottom) 相對棧頂的另一端
入棧(push) 插入操作
出棧(pop) 出棧操作
空棧:無元素的棧
1.2棧的特性
後進先出 ( LIFO-- Last In First Out ),或 先進後出 ( FILO-- First In Last Out )
二、順序棧
2.1基本運算函數
#define MAXLEN 105
typedef struct { //結構體定義順序棧
int data[MAXLEN];
int top;
}seqStack;
void initStack(seqStack *S) { //初始化棧,將棧頂置於-1,這樣開始時從0插入
S->top = -1;
}
bool stackEmpty(seqStack &S){ //判斷棧是否爲空
if(S.top == -1) return true;
else return false;
//return(S->top==-1);
}
bool stackFull(seqStack *S) { //判斷棧是否爲滿
if(S->top == MAXLEN - 1) return true;
else return false;
}
void stackTop(seqStack *S, int *x) { //X取爲棧頂元素
if(S->top == -1) {cout << "EMPTY ERROR" <<endl;return;}
else *x = S->data[S->top];
}
void push(seqStack *S, int x) { //插入
if(S->top == MAXLEN - 1) {
cout <<"ERROR"<<endl;
return;
}else {
S->top++;
S->data[S->top] = x;
}
}
void pop(seqStack *S,int &x) { //彈棧同時取到彈出元素
if(stackEmpty(*S)) {cout <<"ERROR" <<endl; return;}
else {
x = S->data[S->top--];
}
}
2.2 順序棧的特點
所有運算的時間複雜度均爲O(1); 通常一次性申請空間,只能按最大空間需求分配,容易造成空間浪費。-- 使用鏈式棧。
三、鏈棧
(以下運算爲不帶頭結點的運算)
typedef struct {
int data[MAXLEN];
int top;
}seqStack;
typedef struct listNode{
int data;
struct listNode *next;
}node;
void initStack_1(node *&top) {
top = NULL;
}
bool stackEmpty_1(node *top) {
return (top == NULL);
}
bool stackTop(node *top, int x) { //由於頭插法top僅跟着棧頂
if(!top) return false;
else {
x = top -> data;
return true;
}
}
void push_1(node *& top, int x) { //頭插
node *s;
s = new node;
s->data = x;
s->next = top;
top = s;
}
bool pop_1(node *& top, int &x) {
node *u;
if(!top) return false;
else {
x = top->data; //取彈出元素
u = top; //臨時指針指到top
top = top->next; //top 後移
delete(u); //刪除結點
return true;
}
}
void DeleteStack(node *&top) {
node *p, *u;
p = top;
while(p) {
u = p;
p = p->next;
delete(u);
}
top = NULL;
}