Java基礎知識日積月累(Tip of the Day26)
阿新 • • 發佈:2020-10-21
這個作業屬於哪個課程 | https://edu.cnblogs.com/campus/qdu/DS2020 |
---|---|
這個作業要求在哪裡 | https://edu.cnblogs.com/campus/qdu/DS2020/homework/11296 |
這個作業的目標 | <掌握棧的結構特性及其入棧,出棧操作。掌握佇列的結構特性及其入隊、出隊的操作,掌握迴圈佇列的特點及其操作。> |
學號 | 2018204091 |
一、實驗目的
1、掌握棧的結構特性及其入棧,出棧操作;
2、掌握佇列的結構特性及其入隊、出隊的操作,掌握迴圈佇列的特點及其操作。
二、實驗預習
說明以下概念
1、順序棧:
順序棧是棧的順序實現。順序棧是指利用順序儲存結構實現的棧。採用地址連續的儲存空間(陣列)依次儲存棧中資料元素,由於人棧和出棧運算都是在棧頂進行,而棧底位置是固定不變的,可以將棧底位置設定在陣列空間的起始處;棧頂位置是隨入棧和出棧操作而變化的,故需用一個整型變數top來記錄當前棧頂元素在陣列中的位置。
2、鏈棧:
棧的鏈式儲存結構稱為鏈棧。它是運算受限的單鏈表,其插入和刪除操作僅限制在表頭位置上進行。
3、迴圈佇列:
為充分利用向量空間,克服"假溢位"現象的方法是:將向量空間想象為一個首尾相接的圓環,並稱這種向量為迴圈向量。儲存在其中的佇列稱為迴圈佇列(Circular Queue)。這種迴圈佇列可以以單鏈表的方式來在實際程式設計應用中來實現。
4、鏈隊
用連結串列表示的佇列簡稱為鏈隊,一個鏈隊顯然需要兩個分別只是對頭和隊尾的指標才能唯一確定。
三、實驗內容和要求
1、閱讀下面程式,將函式Push和函式Pop補充完整。要求輸入元素序列1 2 3 4 5 e,執行結果如下所示。
#include<malloc.h> #define ERROR 0 #define OK 1 #define STACK_INT_SIZE 10 /*儲存空間初始分配量*/ #define STACKINCREMENT 5 /*儲存空間分配增量*/ typedef int ElemType; /*定義元素的型別*/ typedef struct{ ElemType *base; ElemType *top; int stacksize; /*當前已分配的儲存空間*/ }SqStack; 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){ S->base=(ElemType *)malloc(STACK_INT_SIZE *sizeof(ElemType)); if(!S->base) return ERROR; S->top=S->base; S->stacksize=STACK_INT_SIZE; return OK; }/*InitStack*/ int Push(SqStack *S,ElemType e){ if(S->top-S->base>=S->stacksize){ S->base=(ElemType *)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(ElemType)); if(!S->base) return ERROR; S->top=S->base+S->stacksize; S->stacksize+=STACKINCREMENT; } *S->top++ = e; return OK; }/*Push*/ int Pop(SqStack *S,ElemType *e){ if(S->top==S->base) return ERROR; S->top=--S->top; *e=*S->top; return OK; }/*Pop*/ int CreateStack(SqStack *S){ int e; if(InitStack(S)) printf("Init Success!\n"); else{ printf("Init Fail!\n"); return ERROR; } printf("input data:(Terminated by inputing a character)\n"); while(scanf("%d",&e)) Push(S,e); return OK; }/*CreateStack*/ void PrintStack(SqStack *S){ ElemType e; while(Pop(S,&e)) printf("%3d",e); }/*Pop_and_Print*/ int main(){ SqStack ss; printf("\n1-createStack\n"); CreateStack(&ss); printf("\n2-Pop&Print\n"); PrintStack(&ss); return 0; } ``` 演算法分析:輸入元素序列1 2 3 4 5,為什麼輸出序列為5 4 3 2 1?體現了棧的什麼特性? 由於棧僅能在表尾進行插入和輸出操作,第一個插入棧的元素會儲存在棧底,最後才能輸出,則輸入元素按1 2 3 4 5的次序進棧,按照5 4 3 2 1的次序出棧。 體現了棧只能在其一端進行操作,有後進先出的特性。 2、在第1題的程式中,編寫一個十進位制轉換為二進位制的數制轉換演算法函式(要求利用棧來實現),並驗證其正確性。 實現程式碼 ```int conversion(SqStack *S,int a){ while(a){ int e; e=a%2; Push(S,e); a=a/2; } } int main(){ SqStack ss; int a; printf("please input the number:",a); scanf("%d",&a); InitStack(&ss); conversion(&ss,a); PrintStack(&ss); return 0; } ``` 驗證 ![](https://img2020.cnblogs.com/blog/2148178/202010/2148178-20201021141508877-181686978.png) 3、閱讀並執行程式,並分析程式功能。 ```#include<stdio.h> #include<malloc.h> #include<string.h> #define M 20 #define elemtype char typedef struct { elemtype stack[M]; int top; }stacknode; void init(stacknode *st); void push(stacknode *st,elemtype x); void pop(stacknode *st); void init(stacknode *st) { st->top=0; } void push(stacknode *st,elemtype x) { if(st->top==M) printf("the stack is overflow!\n"); else { st->top=st->top+1; st->stack[st->top]=x; } } void pop(stacknode *st) { if(st->top>0) st->top--; else printf("Stack is Empty!\n"); } int main() { char s[M]; int i; stacknode *sp; printf("create a empty stack!\n"); sp=(stacknode*)malloc(sizeof(stacknode)); init(sp); printf("input a expression:\n"); gets(s); for(i=0;i<strlen(s);i++) { if(s[i]=='(') push(sp,s[i]); if(s[i]==')') pop(sp); } if(sp->top==0) printf("'('match')'!\n"); else printf("'('not match')'!\n"); return 0; }1``` 輸入:2+((c-d)6-(f-7)a)/6 執行結果: ![](https://img2020.cnblogs.com/blog/2148178/202010/2148178-20201021141541053-1691036001.png) ![](https://img2020.cnblogs.com/blog/2148178/202010/2148178-20201021141550433-1320254413.png) 程式的基本功能: 檢驗多項式括號使用是否合法,能否對每個“(”找到與之對應的“)”,即判斷多項式中的括號是否配對。 四,實驗小結:更好地掌握了棧的結構特性及其入棧,出棧操作,佇列的結構特性及其入隊、出隊的操作,迴圈佇列的特點及其操作; 對棧和佇列有了更深的理解,對程式程式碼的實現有了一個更為全面深刻的認識。