1. 程式人生 > >棧和佇列的有關操作

棧和佇列的有關操作

實驗二

實驗名稱:棧和佇列的有關操作

實驗室名稱:

實驗臺號:14

學生姓名: 

專業班級: 2015

指導教師:

實驗日期:2017-6-9

 

一、實驗目的

1、掌握棧、佇列的思想及其儲存實現。

2、掌握棧、佇列的常見演算法的程式實現。

二、實驗儀器及環境:

    PC計算機;windows XP作業系統Visual C++6.0、CodeBlocks

三、實驗內容及結果(按照具體實驗題目,按照如下格式書寫)

 1、

#include <iostream>

#include <cstdio>

#include <cstdlib>

#include <time.h>

#define MAXSIZE 1000

using namespace std;

 

typedef struct{

    int elem[MAXSIZE];

    int top;

}Seqstack;

 

void Init(Seqstack *s){

    s->top=-1;

    return;

}

 

int Empty(Seqstack *s){

    if(s->top==-1)

    return 1;

    return 0;

}

 

int Push(Seqstack *s,int x){

    if(s->top==MAXSIZE-1)

    return 0;

    else{

        s->top++;

        s->elem[s->top]=x;

        return 1;

    }

}

 

int Pop(Seqstack *s,int *x){

    if(s->top==-1)

    return 0;

    else{

        *x=s->elem[s->top];

        s->top--;

        return 1;

    }

}

 

int top(Seqstack *s){

    int x;

    if(s->top==-1)

    return 0;

    else{

        x=s->elem[s->top];

        return x;

    }

}

 

int main()

{

    Seqstack *s;

    int x,num,st;

    s=(Seqstack *)malloc(sizeof(Seqstack));

    Init(s);

    srand((unsigned)time(NULL));

    cout<<"請輸入隨機數入棧的總數:";

    cin>>num;

    cout<<"入棧:";

    while(num>0){

        st=rand()%100+1;

        Push(s,st);

        num--;

        cout<<st<<" ";

    }

    cout<<endl;

    //Push(s,rand()%100+1);Push(s,rand()%100+1);Push(s,rand()%100+1);

    cout<<"出棧:";

    while(!Empty(s)){

        cout<<top(s)<<" ";

        Pop(s,&x);

    }

    cout<<endl;

    return 0;

}

2、

#include <iostream>

#include <cstdio>

#include <cstdlib>

#include <time.h>

#define MAXSIZE 1000

using namespace std;

 

typedef struct{

    int elem[MAXSIZE];

    int top;

}Seqstack;

 

void Init(Seqstack *s){

    s->top=-1;

    return;

}

 

int Empty(Seqstack *s){

    if(s->top==-1)

    return 1;

    return 0;

}

 

int Push(Seqstack *s,int x){

    if(s->top==MAXSIZE-1)

    return 0;

    else{

        s->top++;

        s->elem[s->top]=x;

        return 1;

    }

}

 

int Pop(Seqstack *s,int &x){

    if(s->top==-1)

    return 0;

    else{

        x=s->elem[s->top];

        s->top--;

        return 1;

    }

}

 

int top(Seqstack *s){

    int x;

    if(s->top==-1)

    return 0;

    else{

        x=s->elem[s->top];

        return x;

    }

}

 

int main()

{

    Seqstack *s;

    int x,num=10,st,data,rr;

    s=(Seqstack *)malloc(sizeof(Seqstack));

    Init(s);

    srand((unsigned)time(NULL));

    cout<<"輸入一個十進位制整數:"<<endl;

    cin>>data;

    cout<<"輸入轉化的R進位制整數:"<<endl;

    cin>>rr;

    int res;

    while(data){

        Push(s,data%rr);

        data/=rr;

    }

    //Push(s,rand()%100+1);Push(s,rand()%100+1);Push(s,rand()%100+1);

    while(!Empty(s)){

        Pop(s,x);

        cout<<x;

    }

    return 0;

}

3、

#include <iostream>

#include <cstdio>

#include <cstdlib>

#include <time.h>

#define MAXSIZE 1000

 

using namespace std;

 

typedef struct{

    int data[MAXSIZE];

    int front_,rear_;

}Sequeue;

 

int Init(Sequeue *q){

    if((q=((Sequeue *)malloc(sizeof(Sequeue))))==NULL)

        return 0;

    q->front_=MAXSIZE;

    q->rear_=MAXSIZE;

    return 1;

}

 

int Empty(Sequeue *q){

    if(q->front_==q->rear_)

        return 1;

    else

        return 0;

}

 

int InSequeue(Sequeue *q,int x){

    if((q->rear_+1)%MAXSIZE==q->front_){

        return -1;

    }

    else{

        q->rear_=(q->rear_+1)%MAXSIZE;

        q->data[q->rear_]=x;

        return 1;

    }

}

 

int OutSequeue(Sequeue *q,int *x){

    if(q->front_==q->rear_){

        return -1;

    }

    else{

        q->front_=(q->front_+1)%MAXSIZE;

        *x=q->data[q->front_];

        return 1;

    }

}

 

int main()

{

    Sequeue *s;

    int x,num,st;

    s=(Sequeue *)malloc(sizeof(Sequeue));

    Init(s);

    srand((unsigned)time(NULL));

    cin>>num;

    while(num>0){

        st=rand()%100+1;

        InSequeue(s,st);

        num--;

        cout<<st<<" ";

    }

    cout<<endl;

    //Push(s,rand()%100+1);Push(s,rand()%100+1);Push(s,rand()%100+1);

    while(!Empty(s)){

        OutSequeue(s,&x);

        cout<<x<<" ";

    }

    cout<<endl;

    return 0;

}

 

4、

#include <iostream>

#include <cstdio>

#include <cstdlib>

#include <time.h>

#define MAXSIZE 1000

 

using namespace std;

 

typedef struct{

    int data[MAXSIZE];

    int front_,rear_;

}Sequeue;

 

int Init(Sequeue *q){

    if((q=((Sequeue *)malloc(sizeof(Sequeue))))==NULL)

        return 0;

    q->front_=0;

    q->rear_=0;

    return 1;

}

 

int Empty(Sequeue *q){

    if(q->front_==q->rear_)

        return 1;

    else

        return 0;

}

 

int InSequeue(Sequeue *q,int x){

    if((q->rear_+1)%MAXSIZE==q->front_){

        return -1;

    }

    else{

        q->data[q->rear_]=x;

        q->rear_=(q->rear_+1)%MAXSIZE;

        return 1;

    }

}

 

int OutSequeue(Sequeue *q,int *x){

    if(q->front_==q->rear_){

        return -1;

    }

    else{

        *x=q->data[q->front_];

        q->front_=(q->front_+1)%MAXSIZE;

        return 1;

    }

}

 

int GetHead(Sequeue *Q,int *x){

 if(Q->front_==Q->rear_)

  return 0;

 *x=Q->data[Q->front_];

 return 1;

}

 

void YangHuiTriangle( Sequeue *q,int N)

{

 int n,i,x,temp;

 Init(q);

 InSequeue(q,1);

 for(n=2;n<=N;n++)

 {

  InSequeue(q,1);

  for(i=1;i<=n-2;i++)

  {

   OutSequeue(q,&temp);

   cout<<temp<<" ";

   GetHead(q,&x);

   temp=temp+x;

   InSequeue(q,temp);

  }

 OutSequeue(q,&x);

 cout<<x<<" ";

 InSequeue(q,1);

 cout<<endl;

 }

 while(!Empty(q))

 {

  OutSequeue(q,&x);

  cout<<x<<" ";

 }

}

 

int main()

{

    Sequeue *s;

    int x,num=10,st;

    s=(Sequeue *)malloc(sizeof(Sequeue));

    Init(s);

    int n=0;

    cin>>n;

    YangHuiTriangle(s,n);

    return 0;

}

 

1、

2、

3、

4、

四、實驗心得體會:(包括遇到的問題及解決辦法)

結構體傳參時採用的是結構體的引用,迴圈佇列注意判斷隊滿和隊空的條件,注意堆疊和佇列資料進入和出去的方向。

五、指導教師意見及成績

 

 

                                  簽名: