|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
1.超市内商品的信息包括商品编号和生产日期。用于商品展示的货架,是一个半封闭的货架,客人拿取商品,工作人员上架新的商品,都只能固定在开放的一端进行。当工作人员上架新商品时,需要整理展示架上的商品,使生产日期较早的商品,放在靠近固定开放的一端。请编程模拟对商品展示架中已有商品按生产日期进行整理的过程。
下面是我写的部分代码。
- #include<stdio.h>
- #include<stdlib.h>
- #define stack_init_size 100
- #define stackincrement 10
- #define OK 1
- #define ERROR 0
- typedef int status;
- typedef int selemtype;
- typedef struct{
- selemtype *base;//栈底指针
- selemtype *top;//栈顶指针
- int stacksize;
- }sqstack;
- typedef struct //声明结构体Production用于表示生产日期
- { int year;
- int month;
- int day;
- }production;
- typedef struct
- { int number; //商品编号
- production date; //商品生产日期
- }Selemtype;
- void initstack(sqstack &s)
- {
- s.base=(selemtype*)malloc(stack_init_size*sizeof(selemtype));
- s.top=s.base;
- s.stacksize=stack_init_size;
- }
- void push(sqstack &s,Selemtype e)//入栈
- {
- if(s.top-s.base>=s.stacksize){
- s.base=(selemtype*)realloc(s.base,(s.stacksize+stack_init_size)*sizeof(selemtype));
- if(!s.base)
- printf("error");
- s.top=s.base+s.stacksize;
- s.stacksize+=stack_init_size;
- }
- *s.top=e;
- s.top++;
- }
- void pop(sqstack &s,selemtype k)//出栈
- {
- selemtype *e=s.top-1;
- int i=0;
- if(s.base==s.top){
- printf("栈为空");
- }
- k=*e;
- s.top--;
- }
- status gettop(sqstack s,Selemtype k)//取栈顶元素
- {
- Selemtype e;
- if(s.top!=s.base){
- return k=*(s.top-1);
- }
- return ERROR;
- }
- void print(sqstack &s)//输出
- {
- selemtype *e=s.base;
- int i=0;
- while(i<(s.top-s.base))
- {
- printf("%d ",*e);
- i++;
- e++;
- }
- }
- status judge(sqstack &s,Selemtype e)//栈顶元素大于输入返回1
- {
- Selemtype k;
- gettop(s,k);
- if(k.date.year>e.date.year){
- return OK;
- }
- else if(k.date.year==e.date.year){
- if(k.date.month>e.date.month){
- return OK;}
- else if(k.date.month==e.date.month){
- if(k.date.day>e.date.day){
- return OK;
- }
- else if(k.date.day==e.date.day){
- return OK;
- }
- }
- }
- else {
- return ERROR;
- }
- }
- void Lineup()
- {
- int i,j=1,t;
- sqstack s,temp;
- Selemtype e,k;
- initstack(s);
- initstack(temp);
- while(j!=4)
- {
- printf("1.入库 2.出库 3.查看货物 4.退出\n");
- scanf("%d",&j);
- if(j==1)
- {
- printf("请输入商品编号及生产日期:\n");
- scanf("%d %d %d %d",&e.number,&e.date.year,&e.date.month,&e.date.day);
- if(s.top==s.base)
- {
- push(s,e);
- s.top++;
- }
- else{
- gettop(s,k);
- t=0;
- while(!t){
- pop(s,k);
- push(temp,k);
- t=judge(s,e);
- }
- }
- }
- }
- }
- int main()
- {
- Lineup();
- return 0;
- }
复制代码
商品展示架整理
这个问题可以使用栈来解决,每一个商品都是一个元素,存储商品编号和生产日期。根据生产日期的先后顺序,将商品入栈,并在入栈时进行整理,保证生产日期早的商品在栈底,晚的商品在栈顶。另外,为了方便查看货物,可以在出栈时将商品信息输出。
以下是修改过后的代码:
- ++
- #include <stdio.h>
- #include <stdlib.h>
- #define stack_init_size 100
- #define stackincrement 10
- #define OK 1
- #define ERROR 0
- typedef int status;
- typedef struct {
- int year;
- int month;
- int day;
- } Production;
- typedef struct {
- int number;
- Production date;
- } Element;
- typedef struct {
- Element* base; // 栈底指针
- Element* top; // 栈顶指针
- int stacksize;
- } SqStack;
- void InitStack(SqStack& s) {
- s.base = (Element*)malloc(stack_init_size * sizeof(Element));
- s.top = s.base;
- s.stacksize = stack_init_size;
- }
- void Push(SqStack& s, Element e) {
- if (s.top - s.base >= s.stacksize) {
- s.base = (Element*)realloc(s.base, (s.stacksize + stack_init_size) * sizeof(Element));
- if (!s.base) {
- printf("error");
- return;
- }
- s.top = s.base + s.stacksize;
- s.stacksize += stack_init_size;
- }
- *s.top = e;
- s.top++;
- }
- void Pop(SqStack& s, Element& k) {
- if (s.top == s.base) {
- printf("栈为空\n");
- return;
- }
- s.top--;
- k = *(s.top);
- }
- status GetTop(SqStack s, Element& k) {
- if (s.top != s.base) {
- k = *(s.top - 1);
- return OK;
- }
- return ERROR;
- }
- void Print(SqStack s) {
- Element* e = s.base;
- while (e != s.top) {
- printf("编号:%d,生产日期:%d-%d-%d\n", e->number, e->date.year, e->date.month, e->date.day);
- e++;
- }
- }
- status Judge(Element a, Element b) {
- if (a.date.year < b.date.year) {
- return OK;
- } else if (a.date.year == b.date.year && a.date.month < b.date.month) {
- return OK;
- } else if (a.date.year == b.date.year && a.date.month == b.date.month && a.date.day < b.date.day) {
- return OK;
- } else {
- return ERROR;
- }
- }
- void Lineup() {
- int op = 0;
- SqStack s;
- SqStack temp;
- InitStack(s);
- InitStack(temp);
- while (op != 4) {
- printf("1.入库 2.出库 3.查看货物 4.退出\n");
- scanf("%d", &op);
- switch (op) {
- case 1: {
- Element e;
- printf("请输入商品编号及生产日期:\n");
- scanf("%d %d %d %d", &e.number, &e.date.year, &e.date.month, &e.date.day);
- if (s.top == s.base) {
- Push(s, e);
- } else {
- Element k;
- int t = 0;
- while (!t) {
- Pop(s, k);
- Push(temp, k);
- t = Judge(k, e);
- }
- Push(s, e);
- while (temp.top != temp.base) {
- Pop(temp, k);
- Push(s, k);
- }
- }
- break;
- }
- case 2: {
- Element k;
- Pop(s, k);
- printf("出库:编号:%d,生产日期:%d-%d-%d\n", k.number, k.date.year, k.date.month, k.date.day);
- break;
- }
- case 3: {
- Print(s);
- break;
- }
- case 4: {
- printf("谢谢使用!\n");
- break;
- }
- default: {
- printf("输入有误,请重新输入\n");
- break;
- }
- }
- }
- }
- int main() {
- Lineup();
- return 0;
- }
复制代码
注意在输入商品信息时,要将商品编号和生产日期分别赋值给结构体中的对应成员。另外,为了方便查看货物,可以增加一个“查看货物”功能,输出所有存放在栈中的商品信息。
球一个最佳答案谢谢啦!这对我非常重要!  
|
|