第四次作業 實驗二 棧和佇列

2022-08-23 16:48:09 字數 4397 閱讀 5591

這個作業屬於哪個課程

這個作業要求在**

/homework/11296

這個作業的目標

①掌握棧的結構特性及其入棧,出棧操作②掌握佇列的結構特性及其入隊、出隊的操作,掌握迴圈佇列的特點及其操作

學號2018204167

1、掌握棧的結構特性及其入棧,出棧操作;

2、掌握佇列的結構特性及其入隊、出隊的操作,掌握迴圈佇列的特點及其操作。

說明以下概念

1、順序棧:

由於棧是運算受限的線性表,因此線性表的儲存結構對棧也適用。棧的順序儲存結構簡稱為順序棧,它是運算受限的順序表。

類似於順序表的定義,順序棧也可用向量來實現。因為棧底位置是固定不變的,所以可以將棧底位置設定在向量兩端的任意乙個端點;棧頂位置是隨著進棧和退棧操作而變化的,故需用乙個整型量top來指示當前棧頂位置,通常稱top為棧頂指標。

2、鏈棧:

棧的鏈式儲存結構稱為鏈棧。它是運算受限的單鏈表,其插入和刪除操作僅限制在表頭位置上進行。由於只能在鍊錶頭部進行操作,故鏈棧沒有必要像單鏈表那樣需要附加頭結點。棧頂指標就是鍊錶的頭指標。

3、迴圈佇列:

迴圈佇列就是將佇列儲存空間的最後乙個位置繞到第乙個位置,形成邏輯上的環狀空間,供佇列迴圈使用。在迴圈佇列結構中,當儲存空間的最後乙個位置已被使用而再要進入佇列運算時,只需要儲存空間的第乙個位置空閒,便可將元素加入到第乙個位置,即將儲存空間的第乙個位置作為隊尾。

4、鏈隊

佇列的鏈式儲存結構簡稱為鏈佇列,它是限制僅在表頭刪除和表尾插入的單鏈表。

顯然僅有單鏈表的頭指標不便於在表尾做插入操作,為此再增加乙個尾指標,指向鍊錶上的最後乙個結點。於是,乙個鏈佇列由乙個頭指標和乙個尾指標唯一地確定。

1、閱讀下面程式,將函式push和函式pop補充完整。要求輸入元素序列1 2 3 4 5 e,執行結果如下所示。

#define stack_int_size 10 /*儲存空間初始分配量*/

#define stackincrement 5 /*儲存空間分配增量*/

typedef int elemtype; /*定義元素的型別*/

typedef structsqstack;

int initstack(sqstack *s); /*構造空棧*/

int push(sqstack *s,elemtype e); /*入棧*/

int pop(sqstack *s,elemtype *e); /*出棧*/

int createstack(sqstack *s); /*建立棧*/

void printstack(sqstack *s); /*出棧並輸出棧中元素*/

int initstack(sqstack *s)/*initstack*/

int push(sqstack *s,elemtype e)/*push*/

int pop(sqstack *s,elemtype *e)/*pop*/

int createstack(sqstack *s)

printf("input data:(terminated by inputing a character)\n");

while(scanf("%d",&e))

push(s,e);

return ok;

}/*createstack*/

void printstack(sqstack *s)/*pop_and_print*/

int main()

演算法分析:輸入元素序列1 2 3 4 5,為什麼輸出序列為5 4 3 2 1?體現了棧的什麼特性?

體現了棧是只允許在表的一端進行操作的線性表且具有先進後出的特徵。因為當main函式呼叫printstack(&ss)時,程式轉到函式中,而在該函式體內,又呼叫了int pop(sqstack *s,elemtype *e),此函式的功能是棧s的棧頂元素退棧並返回其值。所以輸入元素序列1 2 3 4 5,輸出序列為5 4 3 2 1。這體現了棧是只允許在表的一端進行操作的線性表且具有先進後出的特徵

2、在第1題的程式中,編寫乙個十進位制轉換為二進位制的數制轉換演算法函式(要求利用棧來實現),並驗證其正確性。

實現**

elemtype n,h;

int m=0,k=0;

initstack(s);

printf("input element\n");

scanf("%d",&n);

while(n)

while(k驗證

3、閱讀並執行程式,並分析程式功能。

#include#include#include#define m 20

#define elemtype char

typedef struct

stacknode;

void init(stacknode *st);

void push(stacknode *st,elemtype x);

void pop(stacknode *st);

void init(stacknode *st)

void push(stacknode *st,elemtype x)

}void pop(stacknode *st)

int main()

輸入:2+((c-d)6-(f-7)a)/6

執行結果:

輸入:a-((c-d)*6-(s/3-x)/2

執行結果:

程式的基本功能:

判斷多項式的左右括號是否配對

以下為選做實驗:

4、設計演算法,將乙個表示式轉換為字尾表示式,並按照字尾表示式進行計算,得出表示式得結果。

實現**

//中綴表示式轉字尾

#include#include#includeusing namespace std;

int prio(char op)

bool trans(string &str,string &str1)

else

s.pop(); //彈出左括號,但不輸出

}else

s.push(str[i]); //把當前運算子入棧

}} }

while (!s.empty())

return true;

}int main()

5、假設以帶頭結點的迴圈鍊錶表示佇列,並且只設乙個指標指向隊尾結點(不設隊頭指標),試編寫相應的置空佇列、入佇列、出佇列的演算法。

實現**:

/*  資料結構演算法題(假設以帶頭結點的迴圈鍊錶表示佇列,

* 並且只設乙個指標指向隊尾元素結點(注意不設頭指標)

* 試編寫相應的佇列初始化,入佇列和出佇列的演算法!)

*/#include#include#include#define ok 1

#define error 0

typedef int qelemtype;

typedef int status;

typedef struct qnode

qnode,*linkqueue;

//鏈式佇列的初始化

status initlinkqueue(linkqueue * l)

(*l)->rear=(*l);

return ok;

}//鏈式佇列的建立

status create(linkqueue * l,int n)

p->next=(*l);

return ok;

}//入隊操作

status enqueue(linkqueue * l,qelemtype e)

//出隊操作

status dequeue(linkqueue * l,qelemtype * e)

//輸出

void print(linkqueue * l)

printf("\n");

}int main()

更好的了解掌握了棧的結構特性及其入棧,出棧操作,佇列的結構特性及其入隊、出隊的操作,迴圈佇列的特點及其操作

第四次實驗 棧和佇列(二)

下面的題目二選一即可 題一 假設稱正讀和反讀都相同的字串行為 回文 例如,abba 和 abcba 是回文,abcde 和 ababab 不是回文。試寫利用棧和佇列來實現的乙個演算法判別讀入乙個以 為結束符的字串行是否是 回文 題二 求解 揹包問題 揹包問題 的基本描述是 有乙個揹包,能盛放的物品總...

第四次作業 棧和佇列

這個作業屬於哪個課程 這個作業要求在 homework 11296 這個作業的目標 掌握棧的結構特性及其入棧,出棧操作。掌握佇列的結構特性及其入隊 出隊的操作,掌握迴圈佇列的特點及其操作。學號2018204163 一 實驗目的 1 掌握棧的結構特性及其入棧,出棧操作 2 掌握佇列的結構特性及其入隊 ...

第四次作業 棧和佇列

這個作業屬於哪個課程 這個作業要求在 homework 11296 這個作業的目標 理解棧 佇列的概念,掌握入棧 出棧 入隊 出隊的操作 學號2018204254 1 掌握棧的結構特性及其入棧,出棧操作 2 掌握佇列的結構特性及其入隊 出隊的操作,掌握迴圈佇列的特點及其操作。說明以下概念 1 順序棧...