1. 程式人生 > 實用技巧 >Java基礎知識日積月累(Tip of the Day26)

Java基礎知識日積月累(Tip of the Day26)

這個作業屬於哪個課程 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)
程式的基本功能:
檢驗多項式括號使用是否合法,能否對每個“(”找到與之對應的“)”,即判斷多項式中的括號是否配對。
四,實驗小結:更好地掌握了棧的結構特性及其入棧,出棧操作,佇列的結構特性及其入隊、出隊的操作,迴圈佇列的特點及其操作;
對棧和佇列有了更深的理解,對程式程式碼的實現有了一個更為全面深刻的認識。