(1)棧(後進先出)的兩種實現方式:指標和表
用指標方式實現棧的基本操作:
createstack(void)
在makeempty中若棧不為空則不停出棧直到棧為空//.h檔案
#ifndef _stack_h_
struct node
;struct node;
typedef
struct node* ptrtonode;
typedef ptrtonode stack;
#endif
stack createstack(void)
入棧和出棧的基本操作(重要),此處的棧都有乙個頭結點void makeempty(stack s)
//判斷棧是否為空
int isempty(s)
}二、棧的應用–表示式求值
如何將表示式變為字尾表示式
中綴表示式:a+b * c+(d * e+f) * g
轉化為字尾表示式:abc* + de * f+g * +
轉化過程:當讀取的是乙個運算元的時候立即輸出,如果是操作符的話,存入棧中,若是左括號,也要存入棧中,
(1)讀取到左括號,將棧中元素彈出並輸出,直到彈出的是左括號(注意只彈出但是不輸出)
(2)如果讀取到的是其他的符號(「+」,「-」,「*」,「\」,「(」),當前棧頂的優先順序高於要進棧的這個元素,則從棧中彈出元素直到遇到優先順序更低的符號為止,然後該元素入棧(注意:除非是遇到),否則(不會彈出的,也就是預設(優先順序最高)
略過中間描述過程,用此方法得到字尾表示式。
表示式求值的時候:利用得到的字尾表示式,看見數字就入棧,遇到運算子就從棧中彈出兩個數字,計算求得結果,並將結果重新壓回到棧中。
尾遞迴有時候並不恰當,有可能因為資料量過於龐大使得堆疊溢位。
費遞迴的程式一般來說確實比等價的遞迴程式要快,但是速度優勢的代價卻是由於遞迴而使得程式清晰性變得不足。
佇列的特點:頭刪尾插,順序佇列保留陣列queue,front,rear
尾部插入:rear和size都加1,置queue[rear] = x
頭部刪除:size減1,front加1,返回值為queue[front]
普通佇列不論刪除還是插入,front和rear的值都是不斷增大的,很容易到達陣列的尾部,改進方法:使用迴圈佇列
迴圈佇列:佇列空:rear = front-1
基本資料結構 棧 佇列和鍊錶
棧 stack 實現的是一種依照先進先出 last in,first out,lifo 原則的結構,也就是說最後放入的元素總是最先被取出。佇列 queue 實現的是一種依照先進先出 first in,first out,fifo 原則的結構,也就是說最先放入的元素總是最先被取出。至於為什麼會存在這兩...
基本資料結構 佇列
佇列實現的是一種先進先出 first in,first out,fifio 的策略,佇列中的插入的操作稱為入隊 enqueue 佇列的刪除操作稱為出隊 dequeue 定義乙個陣列來實現佇列 public class queue public queue int n public boolean i...
基本資料結構 棧
基本資料結構 棧 一.線性資料結構 我們從四個簡單但重要的概念開始研究資料結構。棧,佇列,deques 雙向佇列 列表是一類資料的容器,它們資料元素之間的順序由新增或刪除的順序決定。一旦乙個資料元素被新增,它相對於前後元素一直保持該位置不變。諸如此類的資料結構被稱為線性資料結構。線性資料結構有兩端,...