欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

顺序结构栈与队列之货物货架管理

程序员文章站 2022-04-15 16:40:53
#include #include using namespace std; static int n; //货架(栈)的最大容量 //信息结构体typedef struct /*Inform*/ //可以去掉Inform,在需要在结构体中定义结构体对象(指针 ......
#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;
    }
}