棧:允許插入和刪除的一段叫做棧頂,不允許的一端稱為棧底
遵循先進後出
棧中獲取元素只能通過棧頂指標取棧頂元素
頭部重要宣告
typedef
struct node* pnode;
typedef
struct stack* linkstack;
struct node
;struct stack//該結構體記錄棧的棧頂資訊和儲存資料的多少
;
建立棧函式
linkstack create()
//該函式為stack結構體分配空間,返回stack型別的指標
return lstack;
}
進棧操作函式
pnode gettop
(linkstack lstack)
//獲取棧頂元素的函式
intpush
(linkstack lstack,
int val)
//該函式返回整型是用來判斷是否進棧成功,兩個引數是,鍊錶和插入值
return1;
}
出棧操作
pnode pop
(linkstack lstack)
//返回被彈出的那個元素
銷毀棧操作函式
void
destory
(linkstack lstack)
while
(lstack->sze>0)
;printf
("銷毀成功\n");
}
四則運算:
中綴轉字尾:
對於數字直接輸出
對於符號:左括號:進棧,不管棧中是否有元素(優先順序最低,直接進棧)
運算子:棧為空,直接進棧。若棧中有元素,則棧頂符號進行優先順序比較:優先順序高的先進棧。
若符號優先順序低,將棧頂號彈出,之後使新符號進棧
右括號:不斷將棧頂符號彈出輸出,直接匹配大左括號,再接著讀取下乙個符號需注意,左右括號匹配完成即可,並不講括號輸出;
遍歷結束,將棧中所有符號彈出並輸出
例:1+3*(2+5)
(1) 遍歷字串,第乙個讀到的字元 『1』 ,是數字直接輸出,結果:1
(2) '+'進棧,暫時結果:1
(3) 『3』直接輸出,暫時結果:13
(4) * 優先順序高於現在棧頂的符號,直接進棧,暫時結果:13
(5) 『(』直接進棧
(6) 2輸出,結果:132
(7) + 優先順序比『(』高,進棧;
(8) 5,輸出,結果:1235
(9) ) 進棧,開始彈棧,直到遇到左括號為止,彈完還沒就報錯;結果:1235+
(10)遍歷結束了,可以開始彈棧,結果:1235+*+
字尾表示式運算:
之前:front=rear 來判斷佇列是否為空,現在在迴圈佇列中,他也可以代表隊滿,為了解決這個問題,迴圈佇列約定:少用了乙個元素空間,當隊尾表示rear在隊頭標識front的上乙個元素空間,則隊滿;
#define maxsize 50
typedef
struct cirqueue * seqqueue
struct cirqueue
入隊**:
void
insert
(seqqueue cq,
int val)if(
isempty
(cq)
)else
}
出隊**:
int
del(seqqueue cq)
temp=cq->data[cq->front]
;cq->front=
(cq->rear+1)
%maxsize;
return temp;
}
資料結構 棧和佇列
棧 基礎 知識棧 練習題 佇列 基礎知識 棧示意圖 後進先出 順序棧結構定義 define maxsize 1024 struct stack 操作函式 push 入棧 pop 出棧 struct lstack 鏈棧示意圖 操作函式 push 入棧 pop 出棧 注意 也可以直接呼叫系統已經寫好的庫...
資料結構 棧和佇列
本章的基本內容是 兩種特殊的線性表 棧和佇列 從資料結構角度看,棧和佇列是操作受限的線性表,他們的邏輯結構相同。從抽象資料型別角度看,棧和佇列是兩種重要的抽象資料型別。p棧 限定僅在表的一端進行插入和刪除操作的線性表。p允許插入和刪除的一端稱為棧頂,另一端稱為棧底。p空棧 不含任何資料元素的棧。a ...
資料結構 棧和佇列
用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。class solution int pop node stack2.top stack2.pop return node private stack stack1 stack stack2 大家都知道斐波那契數列,現...