- 采用顺序栈完成进制转换
(1)定义顺序栈的存储结构;
(2)实现顺序栈的初始化、判断是否为空、进栈、出栈等基本操作;
(3)调用顺序栈的基本操作实现进制转换。 - 采用循环队列或链队列实现病人看病的模拟程序
(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;
}
}
}