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

#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;
    }
}

原文地址:https://www.cnblogs.com/XingPengJu/p/9929107.html

时间: 2024-10-08 10:51:10

顺序结构栈与队列之货物货架管理的相关文章

数据结构和算法-数据结构-线性结构-栈和队列

 ################################################## """ 三.线性结构 (1)栈 1.定义:栈是一个数据集合,可以理解为只能在一端进行插入或者删除操作的列表. 2.栈的特点:后进先出(last-in,first-out),简称LTFO表 这种数据结构的特点: 就是像是杯子或者是弹夹,电梯, 存储的时候从底部开始,读取的时候从顶部开始,具备这种特点就是栈 就是后进先出, 存储的时候就可以从顺序表或者链表就可以实现, 只让从一

线性结构——栈和队列

栈类 1 public class MyStack<T> { 2 //栈的大小 3 private int size; 4 //存放栈的数组 5 private Object[] data; 6 7 /** 8 * 无参构造方法,初始化数组大小 9 */ 10 public MyStack() { 11 size = -1; 12 data = new Object[10]; 13 } 14 15 /** 16 * 有参构造方法,自定义数组大小 17 */ 18 public MyStack(

顺序结构的循环队列

//循环队列 #include <stdio.h> #include<stdlib.h> #define MAXSIZE 5 #define status int struct Queue { int* base; int front; int real; }Q; status initQueue(Queue &Q) { Q.base=(int *)malloc(MAXSIZE*sizeof(int)); if(!Q.base) { printf(" 内存分配失败

基础数据结构 链表、栈、队列

数据结构是程序设计中一个非常重要的部分,基本的数据结构包括链表.栈和队列,当然高级一点的还有树.图等,实际上链表.栈和队列都是线性表,只是在操作和表示方式上有所不同,线性表用顺序结构表示就是顺序表,用链结构表示就是链表,如果对线性表的操作加以限制,只能有在表尾进行插入和删除元素,这就变成栈了,如果只能允许元素从表尾插入,表头删除,这就变成队列了. 链表 /* * 数据结构 链表 * 链式结构 */ #include <iostream> using namespace std; enum St

数据结构10:栈和队列

数据结构栈(Stack)和队列(Queue)详解 本章讲解了两种特殊的线性表结构——栈和队列.读者要重点理解栈的“先进后出”原则和队列的“先进先出”原则,体会两种特殊的线性表结构的应用场景. 本章内容: 1. 栈(Stack)的概念和应用及C语言实现 2. 数据结构实践项目之进制转换器 3. 括号匹配算法及C语言实现 4. 队列(Queue):“先进先出”的数据结构 5. 数据结构实践项目之变态的停车场管理系统 6. 扑克牌游戏及C语言实现 原文地址:https://www.cnblogs.co

栈和队列分别的顺序结构和链式结构

栈和队列 栈和队列本身作为特殊的线性表,要记住他俩本身就费劲.难受的是他俩还能分别考虑顺序结构和链式结构,很复杂,容易混淆. 其实比起FILO(先进后出)和FIFO(先进先出)等特点,更重要的是对指针的把握.进出顺序是在逻辑层面的,只要理解就行,难得是如何用指针来表示这种特点,于是我就此方面进行个总结. 顺序栈 虽然栈只需要对一段进行操作(栈顶),但我们除了栈顶指针(top)外,还需要设置栈底指针(base),主要是为了用于判断栈空栈满. s.top == s.base; //当栈顶指针等于栈底

小猪的数据结构辅助教程——3.1 栈与队列中的顺序栈

小猪的数据结构辅助教程--3.1 栈与队列中的顺序栈 标签(空格分隔): 数据结构 本节学习路线图与学习要点 学习要点 1.栈与队列的介绍,栈顶,栈底,入栈,出栈的概念 2.熟悉顺序栈的特点以及存储结构 3.掌握顺序栈的基本操作的实现逻辑 4.掌握顺序栈的经典例子:进制变换的实现逻辑 1.栈与队列的概念: 嗯,本节要进行讲解的就是栈 + 顺序结构 = 顺序栈! 可能大家对栈的概念还是很模糊,我们找个常见的东西来拟物化~ 不知道大家喜欢吃零食不--"桶装薯片"就可以用来演示栈! 生产的时

数据结构回顾之顺序存储结构中的线性表(栈与队列顺序线性表实现)

说到数据结构呢,对于一个Coder来说还是蛮重要的啦,每次看数据结构的东西都有新的收获,这两天在回顾数据结构的知识.当然啦,虽然数据结构有些是理论的东西,如果好好的理解数据结构的东西还是少不了的代码的支撑的.数据结构简单的来说吧,可以分为两大类,一个是数据的"物理存储结构",另一种是数据的"逻辑存储结构".数据的"物理存储结构"又可分为顺序的和链式的(下面将会结合着代码打印内存地址的形式来观察物理存储结构). 逻辑存储结构又可分为集合,线性, 树

线性表 及Java实现 顺序表、链表、栈、队列

数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值,至少在一段时间之后,技术可以很快得到提高.同时,它也是软考的重点,我们需要对这部分的内容进行一下总结. 我们先看一下数据结构和算法的整体内容. 1.线性表 概念: 数据元素的排列方式是线性的. 分类: 分类规则是根据上图中元素的存储结构来划分的. (1)顺序表 基本思想:元素的存储空间是连续的.在内