实验二 栈和队列的实现和应用

  1. 采用顺序栈完成进制转换
    (1)定义顺序栈的存储结构;
    (2)实现顺序栈的初始化、判断是否为空、进栈、出栈等基本操作;
    (3)调用顺序栈的基本操作实现进制转换。
  2. 采用循环队列或链队列实现病人看病的模拟程序
    (1)定义队列的存储结构;
    (2)实现队列的初始化、判断是否为空、入队、出队等基本操作;
    (3)调用队列的基本操作实现病人看病模拟程序包括排队、就诊、查询、退出等功能;
    3.比较栈和队列的区别
    栈和队列的区别:
    1:队列先进先出,栈先进后出
    2:栈只允许在表尾一端进行插入和删除,而队列只允许在表尾一端进行插入,在表头一端进行删除。

顺序栈实现进制转换

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include <malloc.h>
using namespace std;
typedef int SElemType;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

typedef struct {
	SElemType *base;//在栈构造和销毁之前,base的值为NULL;
	SElemType *top;//栈顶指正
	int stacksize;//当前已经分配的存储空间
}SqStack;

int n, m;
int e;
SqStack S;
//调用基本操作实现进制转换

//栈的初始化 空栈
bool InitSack(SqStack &S) {
	S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
	if (!S.base) return false;
	S.top = S.base;
	S.stacksize = STACK_INIT_SIZE;
	return true;
}

//判断是否为空
bool StackEmpty(SqStack &S)
{
	if (S.top == S.base) return false;
	return true;
}

//进栈
bool Push(SqStack &S, int e)
{
	if (S.top - S.base >= S.stacksize) {//栈满,追加空间
		S.base = (SElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT)*sizeof(SElemType));
		if (!S.base) return false;
		S.top = S.base + S.stacksize;
		S.stacksize += STACKINCREMENT;
	}
	*S.top++ = e;
	return true;
}

//出栈
void Pop(SqStack &S, int &e)
{//若栈不空。删除栈顶元素,用e返回值
	e = *--S.top;
}

//进制转换
void conversion()
{
	if (!InitSack(S))
	{
		printf("内存分配失败!\n");
		return;
	}
	printf("%d用%d进制表示为:", n, m);
	while (n) {
		if (Push(S, n%m)) {
			n = n / m;
		}
		else {
			printf("内存分配失败!\n");
			break;
		}
	}
	while (StackEmpty(S)) {
		Pop(S, e);
		printf("%d", e);
	}
	printf("\n");
}
int main()
{
	printf("请输入一个非负十进制数:");
	scanf("%d", &n);
	printf("请输入转换进制:");
	scanf("%d", &m);
	conversion();
	system("pause");
	return 0;
}

在这里插入图片描述
病人看病系统

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define NULL0
#define LEN sizeof(struct bingli)
struct bingli
{
    int number;
    struct bingli*next;
}bingli;
int Menu_select()
//菜单选择程序,要求用户输入一个正确的菜单选项。如果不正确,则重复调用此子程序,直到输入的值是正确的
{
    int sn;
    for(;;)
    {
        scanf("%d",&sn);
        if(sn<0||sn>5)
            printf("\n\t 输入错误,请重新输入!\n");
        else
            break;
    }
    return sn;
}
struct bingli*(creat())
//创建一个单链表。如果创建成功,则返回这个单链表的表头;如果创建不成功,则退出程序。
{
    struct bingli*head;
    struct bingli*p1,*p2;
    int n=0;
    if(!(p1=(struct bingli*)malloc(LEN)))exit(1);
    p2=p1;
    printf("请输入病历号(以输入数字0表示结束)\n");
    scanf("%d",&p1->number);
    head=NULL;
    while(p1->number!=0)
    {
        n=n+1;
        if(n==1)
            head=p1;
        else
            p2->next=p1;
        p2=p1;
        p1=(struct bingli*)malloc(LEN);
        scanf("%d",&p1->number);
    }
    p2->next=NULL;
    p1=head;
    printf("排队成功!\n");
    return(head);
};
void ListInsert_rear(struct bingli*head)
//创建一个单链表成功后,再次排队时则调用此子程序,作用是在单链表尾部插入
{
    struct bingli*p4,*p5;
    if(!(p4=(struct bingli*)malloc(LEN)))exit(2);
    printf("请输入病历号!\n");
    scanf("%d",&p4->number);
    p5=head;
    while(p5->next!=NULL)
    p5=p5->next;
    p5->next=p4;
    p4->next=NULL;
     printf("排队成功!\n");
}
struct bingli*(ListDelete(struct bingli*head))
//就诊程序。作用就是输出就诊的病历号(即队首元素),并且删除队首元素,释放其所占空间。
{
    printf("就诊的病历号为:%d\n",head->number);
    struct bingli*p6;
    p6=head;
    head=head->next;
    free(p6);
    return(head);
};
void display(struct bingli*head)
//显示所有队列元素
{
    struct bingli*p9;
    p9=head;
    while(p9!=NULL)
    {
       printf("%d\n",p9->number) ;
       p9=p9->next;
    }
}
int main()
{
     struct bingli*head;
     printf("**********************************\n");
     printf("*     欢迎进入就以排队管理系统! *\n");
     printf("\n*\t请选择操作:             *\n");
     printf("*\t<1>:排队;                *\n");
     printf("*\t<2>:就诊;                *\n");
     printf("*\t<3>:查看排队情况;        *\n");
     printf("*\t<4>:不再排队;            *\n");
     printf("*\t<5>:下班--退出运行;      *\n");
     printf("**********************************\n");
     int j=1;
     while(1)
     {
         switch(Menu_select())
         {
         case 1:
            printf("1:排队:  \n");
            if(j==1)
            {
                j++;
                head=creat();
            }
            else ListInsert_rear(head);
            break;
         case 2:
             printf("2:就诊:  \n");
             head=ListDelete(head);
             break;
         case 3:
             printf("3:查看排队情况:  \n");
             display(head);
             break;
         case 4:
              printf("4:不再排队,余下顺序就诊:  \n");
              display(head);
              return 0;
              break;
         case 5:
              printf("5:下班--退出运行。  \n");
              return 0;
         }
     }
}

在这里插入图片描述

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值