實驗二 棧和佇列
阿新 • • 發佈:2020-10-18
這個作業屬於哪個課程 | https://edu.cnblogs.com/campus/qdu/DS2020 |
---|---|
這個作業要求在哪裡 | https://edu.cnblogs.com/campus/qdu/DS2020/homework/11296 |
這個作業的目標 | <棧和佇列> |
學號 | 2018204153 |
一、實驗目的
1、掌握棧的結構特性及其入棧,出棧操作;
2、掌握佇列的結構特性及其入隊、出隊的操作,掌握迴圈佇列的特點及其操作。
二、實驗預習
說明以下概念
1、順序棧:棧的順序儲存結構。
2、鏈棧:棧的鏈式儲存結構。
3、迴圈佇列:首尾相連的順序佇列。
4、鏈隊:佇列的鏈式儲存結構。
三、實驗內容和要求
1、閱讀下面程式,將函式Push和函式Pop補充完整。要求輸入元素序列1 2 3 4 5 e,執行結果如下所示。
#include<stdio.h> #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; 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?體現了棧的什麼特性?
按照先進後出的原則儲存資料,先進入的資料被壓入棧底,最後的資料在棧頂,需要讀資料的時候從棧頂開始彈出資料(最後一個數據被第一個讀出來)。
體現了先進後出,元素逆序輸出。
2、在第1題的程式中,編寫一個十進位制轉換為二進位制的數制轉換演算法函式(要求利用棧來實現),並驗證其正確性。
實現程式碼
#include<stdio.h> #include<malloc.h> #define ERROR 0 #define OK 1 #define STACK_INIT_SIZE 10 #define STACKINCREMENT 5 typedef int SElemType; typedef struct { SElemType *base; SElemType *top; int stacksize; }SqStack; int InitStack(SqStack &S); int CreateStack(SqStack *S); int GetTop(SqStack S,SElemType &e); int Push(SqStack &S, SElemType e); int Pop(SqStack &S, SElemType &e); void conversion(); void main() { int e; SqStack S; CreateStack(S); GetTop( S, e); Push( S, e); conversion(); } int InitStack(SqStack &S) { S.base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); if(!S.base)return ERROR; S.top=S.base; S.stacksize=STACK_INIT_SIZE; } 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; } int GetTop(SqStack S,SElemType &e) { if(S.top==S.base) return ERROR; e=*(S.top-1); return OK; } int Push(SqStack &S,SElemType e) { if(S.top-S.base>=S.stacksize) { S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof (SElemType)); if(!S.base)return ERROR; S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } } int Pop(SqStack &S,SElemType &e) { if(S.top==S.base)return ERROR; e=*--S.top; return 0K; } void conversion() { int n,e; SqStack S; printf("input data:\n"); scanf("%d",n); while(n) { Push(S,n); n=n/2; } Pop(S,e); printf("%d",e); }
驗證
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=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;
}
輸入:2+((c-d)6-(f-7)a)/6
執行結果:
輸入:a-((c-d)*6-(s/3-x)/2
執行結果:
程式的基本功能:
判斷所輸入多項式的左右括號是否配對。
四、實驗小結
學習棧的結構特性及其入棧,出棧操作;掌握佇列的結構特性及其入隊、出隊的操作,練習迴圈佇列的特點及其操作。