1、/*入栈*/void Push(SqStack *p,ElemType x) if(p-toptop=p-top+1; p-stackp-top=x; elseOverflow!n/*出栈*/ElemType Pop(SqStack *p) ElemType x; if(p-top!=0) x=p-top;以前的栈顶数据元素%d已经被删除!,p-top);top-1; return(x); printf(Underflow! return(0);/*获取栈顶元素*/ElemType GetTop(SqStack *p)/*遍历顺序栈*/void OutStack(SqStack *p) int
2、 i; printf(0)这是一个空栈! for(i=p-top;i=0;i-) printf(第%d个数据元素是:%6dn,i,p-stacki);/*置空顺序栈*/void setEmpty(SqStack *p)top= -1;/*主函数*/main() SqStack *q; int y,cord;ElemType a; do第一次使用必须初始化!n 主菜单 nn 1 初始化顺序栈 nn 2 插入一个元素 nn 3 删除栈顶元素 nn 4 取栈顶元素 nn 5 置空顺序栈 nn 6 结束程序运行 nn-n请输入您的选择( 1, 2, 3, 4, 5,6) scanf(%d,&cord)
3、; switch(cord) case 1: q=(SqStack*)malloc(sizeof(SqStack); InitStack(q); OutStack(q); break; case 2: printf(请输入要插入的数据元素:a= scanf(a); Push(q,a); case 3: Pop(q); case 4: y=GetTop(q); printf(n栈顶元素为:%dn,y); case 5: setEmpty(q);n顺序栈被置空! case 6: exit(0); while (cord=6);实验2 栈的链式表示和实现编写一个程序实现链栈的各种基本运算,并在此基础
4、上设计一个主程序,完成如下功能:(1)初始化链栈(2)链栈置空(3)入栈(4)出栈(5)取栈顶元素(6)遍历链栈链栈是没有附加头结点的运算受限的单链表。栈顶指针就是链表的头指针。(1)LinkStack结构类型的定义可以方便地在函数体中修改top指针本身(2)若要记录栈中元素个数,可将元素个数属性放在LinkStack类型中定义。(3)链栈中的结点是动态分配的,所以可以不考虑上溢。#include typedef int Elemtype;typedef struct stacknode Elemtype data; stacknode * next;StackNode;typedef str
5、uct stacknode * top; =1;printf(the maze is:=1;topi.y=0;maze10=2;/*回溯算法*/doif(topi.c=1&chtop=0;for(i=0;itop=NULL;int InitQueue(LinkQueueCar *Q) /*初始化便道*/Q-head=(QueueNode *)malloc(sizeof(QueueNode);if(Q-head!=NULL)head-next=NULL;Q-rear=Q-head;return(1);else return(-1);void PRINT(CarNode *p,int room)
6、/*打印出站车的信息*/ int A1,A2,B1,B2;n请输入离开的时间:/*:*/scanf(%d:(p-n离开车辆的车牌号为:puts(p-num);n其到达时间为: %d:;离开时间为:A1=p-A2=p-B1=p-B2=p-n应交费用为: %2.1f元,(B1-A1)*60+(B2-A2)*price);free(p);int Arrival(SeqStackCar *Enter,LinkQueueCar *W) /*车辆到达*/ CarNode *p;QueueNode *t;p=(CarNode *)malloc(sizeof(CarNode);flushall();n请输入车
7、牌号(例:陕A1234):gets(p-if(Enter-MAX) /*车场未满,车进车场*/Enter-top+;n车辆在车场第%d位置.,Enter-top);n请输入到达时间:Enter-stackEnter-top=p;else /*车场已满,车进便道*/n该车须在便道等待!t=(QueueNode *)malloc(sizeof(QueueNode);t-data=p;W-rear-next=t;rear=t; void Leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W) /*车辆离开*/int i, room;Ca
8、rNode *p,*t;QueueNode *q;/*判断车场内是否有车*/top0) /*有车*/ while(1) /*输入离开车辆的信息*/ printf(n请输入车在车场的位置/1-%d/:room);if(roomroomtop) break;while(Enter-room) /*车辆离开*/Temp-Temp-stackTemp-top=Enter-top-;p=Enter-while(Temp-=1)top=Temp-PRINT(p,room);/*判断通道上是否有车及车站是否已满*/if(W-=W-rear)&MAX) /*便道的车辆进入车场*/ q=W-next;t=q-d
9、ata;n便道的%s号车进入车场第%d位置.,t-num,Enter-n请输入现在的时间/*:*/:(t-next=q-if(q=W-rear) W-rear=W-top=t;free(q);n便道里没有车.nn车场里没有车. /*没车*/ void List1(SeqStackCar *S) /*列表显示车场信息*/int i;if(S-0) /*判断车站内是否有车*/n车场:n 位置 到达时间 车牌号nfor(i=1;=S- %d ,i);%d ,S-stacki-puts(S-n车场里没有车void List2(LinkQueueCar *W) /*列表显示便道信息*/ QueueNod
10、e *p;p=W-if(W-rear) /*判断通道上是否有车*/n等待车辆的号码为:while(p!puts(p-data-p=p-n便道里没有车.void List(SeqStackCar S,LinkQueueCar W)int flag,tag;flag=1;while(flag)n请选择 1|2|3:n1.车场n2.便道n3.返回n scanf(tag);if(tag=1|tag=3) break;switch(tag)case 1:List1(&S); /*列表显示车场信息*/List2(&W); /*列表显示便道信息*/flag=0; 思考题:(1)读栈顶元素的算法与退栈顶元素的
11、算法有何区别(2)如果一个程序中要用到两个栈,为了不发生上溢错误,就必须给每个栈预先分配一个足够大的存储空间。若每个栈都预分配过大的存储空间,势必会造成系统空间紧张。如何解决这个问题(3)栈的两种存储结构在判别栈空与栈满时,所依据的条件有何不同(4)在程序中同时使用两个以上的栈时,使用顺序栈共享邻接空间则很难实现,能否通过链栈来方便地实现如何实现(5)简述栈和队列的共同点和不同点。它们为什么属于线性表(6)在顺序队列中,当队尾指针已经指向了队列的最后一个位置时,但事实上队列中可能还有空位置。此时若有元素入列,就会发生“假溢出”。(7)链栈只有一个top指针,对于链队列,为什么要设计一个头指针和一个尾指针(8)一个程序中如果要用到两个栈时,可通过两个栈共享一维数组来实现。即双向栈共享邻接空间。如果一个程序中要用到两个队列,能否实现如何实现假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意:不设头指针),试编写相应的队列初始化、入队列和出队列算法。(9) 设计算法实现括弧配对的检查。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1