- 论坛徽章:
- 0
|
商品货架管理(**)
[问题描述]
商店货架以栈的方式摆放商品。生产日期越近的越靠近栈底,出货时从栈顶取货。一天营业结束,如果货架不满,则需上货。入货直接将商品摆放到货架上,则会使生产日期越近的商品越靠近栈顶。这样就需要倒货架,使生产日期越近的越靠近栈底。
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef int Status;
#define ERROR -1;
typedef struct SNode {
SNode(float d,struct SNode *p=NULL)
{
date=d;
next=p;
}
float date;
struct SNode *next;
} ElemType;
/*
*商品架的栈定义
*
*/
//栈定义
typedef struct {
ElemType *base;
ElemType *top;
int STACKSIZE;
} Stack;
Status InitStack(Stack &S)
//栈的初始化
{
ElemType *p=new ElemType(0,NULL);
if(!p)
exit(-2);
S.top=S.base=p;
return 0;
}
Status DestoryStack(Stack &S)
//栈的销毁
{
ElemType *q;
while(S.top!=S.base)
{
q=S.top->next;
S.top=q->next;
delete q;
}
delete S.base;
return 0;
}
Status ClearStack(Stack &S)
//清空
{
ElemType *q;
while(S.top!=S.base)
{
q=S.top->next;
S.top=q->next;
delete q;
}
return 0;
}
Status StackEmpty(Stack &S)
//判断是否为空
{
return S.top==S.base;
}
Status StackLength(Stack &S)
//计算栈中结点的个数
{
int count=0;
ElemType *q=S.top->next;
while(q!=NULL&&++count)
{
q=q->next;
}
return count;
}
Status GetTop(Stack &S,float d)
//返回第一个结点的时间属性
{
if(S.top==S.base)
return ERROR;
d=S.top->date;
return 0;
}
Status Push(Stack &S,float d)
//进栈
{
ElemType *p=new ElemType(d,NULL);
if(!p)
exit(-2);
ElemType *q=S.top->next;
if(NULL==q)//如果第一次进栈则将栈底指针指向它
S.base=p;
p=S.top->next;
S.top=p;
return 0;
}
Status Pop(Stack &S,float d)
//出栈
{
if (S.top==S.base)
return ERROR;
ElemType *p=S.top;
d=p->date;
S.top=p->next;
delete p;
return d;
}
Status Traversal(Stack &S)
//栈的遍历并打印到屏幕上
{
ElemType *p=S.top->next;
while((p!=NULL)&&(p=p->next))
{
cout<<p->date<<" ";
}
cout<<"\n";
return 0;
}
typedef SNode QNode, *Queueptr;
/*
*商品上架的中转队列
*
*/
typedef struct {
Queueptr front;
Queueptr rear;
} LinkQueue;
Status InitQueue(LinkQueue &Q)
//初始化队列
{
Q.front=Q.rear=new QNode(0,NULL);
if (!Q.front)
exit(-2);
return 0;
}
Status DestoryQueue(LinkQueue &Q)
//销毁队列
{
Queueptr p;
while(Q.front!=Q.rear)
{
p=Q.front->next;
Q.front=p->next;
delete p;
}
return 0;
}
Status EnQueue(LinkQueue &Q,float d)
//将d插入队列尾
{
Queueptr p=new QNode(d,NULL);
if(!p)
exit(-2);
Q.rear->next=p;
Q.rear=p;
return 0;
}
Status DeQueue(LinkQueue &Q,float d)
//删除队列头第一个元素并返回其值
{
if(Q.front==Q.rear)
return ERROR;
Queueptr p=Q.front->next;
d=p->date;
Q.front->next=p->next;
if(Q.rear==p)
Q.rear=Q.front;
delete p;
return 0;
}
Status GetHead(LinkQueue Q,float d)
//取出队列中的元素
{
Queueptr p=Q.front;
Q.front=p->next;
d=p->date;
delete p;
return d;
}
/*
*主函数入口
*
*/
int main()
{
Stack Goods;//建立商品柜台
InitStack(Goods);//初始化柜台
cout<<"请输入刚开始时的商品,生产日期近的在前面(0退出):\n\n";
//****问题所在\|/*************************//
float sDate=-1.0;
int count=0;
while(1)
{
++count;
cout<<"请输入第"<<count<<"件商品的生产日期:____\b\b\b\b";
cin>>sDate;
cout<<"ERROR!!!";
if(sDate==0)
break;
Push(Goods,sDate);
}
//****问题所在/|\************************//
//出售一部分商品
cout<<"\n\n请输入本日售出商品的件数:__\b\b";
int num,i;
num=i=0;
cin>>num;
float nonsense=0;
while(++i<=num)
{
Pop(Goods,nonsense);
}
//摆放一部分商品进队列
LinkQueue QGoods;
InitQueue(QGoods);
cout<<"\n请输入新加入商品的生产日期,最后输入的日期为最近(0退出):";
float NDate=-1;
int Ncount=0;
while(++Ncount)
{
cout<<"\n请输入第"<<Ncount<<"件商品的生产日期:____\b\b\b\b";
cin>>NDate;
if(NDate==0)
break;
EnQueue(QGoods,NDate);
}
//从栈中取出商品放在队列的末尾
float tDate=-1;
Pop(Goods,tDate);
EnQueue(QGoods,tDate);
//将所有队列中的商品进栈
GetHead(QGoods,tDate);
Push(Goods,tDate);
//依次输出栈中商品的信息
cout<<"新货上架后排列顺序如下:\n";
Traversal(Goods);
return 0;
}
[ 本帖最后由 zkeey 于 2008-4-19 10:18 编辑 ] |
|