1. 程式人生 > >順序結構棧與佇列之貨物貨架管理

順序結構棧與佇列之貨物貨架管理

#include <iostream>#include<string.h> using namespace std; static int n;       //貨架(棧)的最大容量 //資訊結構體typedef struct /*Inform*/      //可以去掉Inform,在需要在結構體中定義結構體物件(指標)時不能去掉{    string name;    int a;}Inform; //棧的*順序*結構體typedef struct{    Inform *base;      //棧和佇列儲存的元素都為inform類,所以指標定義為inform類    Inform *top;    int stacksize;}SqStack; //佇列*順序*結構體typedef struct{    Inform *base;    int fro;    int rear;}SqQueue; void Found1(SqStack &s);      //貨物上架void Found2(SqStack &s);      //建立順序空棧void Foundd(SqQueue &d);      //建立順序佇列void TurnsZ1(SqStack &s1,SqQueue d);      //對於前天未剩餘(第一天)倒貨void TurnsZ2(SqStack &s1,SqStack &s1_,SqStack s2);      //對於前天有剩餘倒貨void Print(SqStack &s1);        //取下貨架上的貨物 int main(){    int day=1,k;    cout << "請輸入貨架的最大容量\t";    cin >> n;    SqStack s1,s1_,s2;      //s1為貨架貨物;  s1_為第二天上架貨物暫存處  s2:臨時棧    SqQueue d;      //宣告佇列    Found2(s1);    Found2(s1_);    Found2(s2);    //建立四個空棧    while(k!=3)    {       cout<<"第"<<day++<<"天貨物上架"<<endl;       if(s1.base==s2.top)       {           Found1(s1);           TurnsZ1(s1,d);           cout<<"1:出售貨物 2:繼續上貨 3:結束上貨"<<endl;           if(k==1)              cin>>k;           switch(k)           {               case 1:                   {                   Print(s1);                   cout<<"2:繼續上貨 3:結束上貨"<<endl;                   cin>>k;                   }               case 2: break;               default:break;           }       }       else       {           Found1(s1_);           TurnsZ2(s1,s1_,s2);           cout<<"1:出售貨物 2:繼續上貨 3:結束上貨"<<endl;           k=1;           if(k==1)              cin>>k;           switch(k)           {               case 1:                   {                   Print(s1);                   cout<<"2:繼續上貨 3:結束上貨"<<endl;                   cin>>k;                   }               case 2: break;               default:break;           }       }    }    while(1)       {           int m;           cout<<"1:出售貨物 2:貨物暫存,退出程式"<<endl;           cin>>m;           if(m==1)            Print(s1);           else            break;       }    return 0;} void Found1(SqStack &s)      //貨物上架(棧){    Inform e;    cout << "輸出break結束"<<endl;    while(1)    {        if(s.stacksize>n)            break;        cin >> e.name ;        if(e.name=="break")            break;        cin >> e.a;        *s.top++ = e;        s.stacksize++;    }} void Found2(SqStack &s)      //建立空棧{    s.base = new Inform [n];    s.top = s.base;    s.stacksize = 0;} void Foundd(SqQueue &d)      //建立佇列{    d.base = new Inform [n];    d.fro=d.rear=0;}//倒貨void TurnsZ1(SqStack &s1,SqQueue d)      //新品上架倒貨  主要思想:1.貨架始終為棧s1  2.第n天上貨,貨架無貨,舊貨入佇列,新貨入棧,之後佇列舊貨入棧{    Foundd(d);    Inform e;    int t;    while(s1.base != s1.top)    {         e = *(s1.top-1);      //*(s1.top--)指向的仍然是s1.top         s1.top--;         s1.stacksize--;         t=d.rear;         d.rear=(d.rear+1)%100;      //迴圈順序佇列         d.base[t] = e;    }    while(d.fro != d.rear)    {        t=d.fro;        d.fro=(d.fro+1)%100;        e=d.base[t];        *s1.top++=e;        s1.stacksize++;    }}void TurnsZ2(SqStack &s1,SqStack &s1_,SqStack s2)        //前天貨架有餘貨,倒貨。   主要思想:1.s1為貨架棧 2.新貨存入棧s1_, 貨架(s1)貨物匯入s2,然後s1_入貨架(s1),s2入貨架(s1)
{    Inform e;    while(s1.top!=s1.base)    {        e=*(s1.top-1);        s1.top--;        s1.stacksize--;        *s2.top++=e;        s2.stacksize++;    }    while(s1_.top!=s1_.base)    {        e=*(s1_.top-1);        s1_.top--;        s1_.stacksize++;        *s1.top++=e;        s1.stacksize++;    }
    while(s2.top!=s2.base)    {        e=*(s2.top-1);        s2.top--;        s2.stacksize--;        *s1.top++=e;        s1.stacksize++;    }} void Print(SqStack &s1){    cout<<"請輸入從貨架出售貨物件數\t"<<endl;    int s;    cin>>s;    while(1)    {        if(s<=s1.stacksize)        {            for(int i=0;i<s;i++)            {                Inform e;                s1.top--;                e=*s1.top;                cout<<e.name<<" "<<e.a<<endl;            }            break;        }        else            cout<<"貨架貨物不足"<<endl;    }}