数据结构与算法分析(C++语言版)_张琨版 第三章栈和队列课后习题答案

一、选择题

  1. D A 2.A 3.C 4.D 5.C 6. B 7.C 8.C 9. C 10.A

二、填空题

1.栈顶 2.链栈 3. 空 4.不可能 5. O(1) 6. A D
7.设所创建的链栈为s 则s=NULL 8. 链栈头 链栈头
9.设所创建的链队指针为p 则p->next=NULL
10. LiQueue * qu=( LiQueue *)malloc(sizeof(LiQueue)); //申请空间
qu->front=qu->rear=NULL; //队头队尾指针置为NULL

三、判断题

  1. × 当栈中只有一个元素时,这个元素也称栈底元素,它可以删除
  2. × 顺序栈是指用顺序存储结构实现的栈,栈中的元素不一定是有序的
  3. × 比如进栈序列是123 出栈序列可以是132
  4. √ 当栈中只有一个元素时就是这种情况
  5. × 可以进行任意多次的进栈、出栈操作,但栈中最多只有m个元素
  6. × 可以进行任意多次的进栈、出栈操作
  7. × 只要栈不满就可以进行进栈操作,只要栈不空就可以进行出栈操作,并不规定进栈、出栈操作的次序
  8. × 空栈是指栈中没有元素,但一定有栈顶元素
  9. √ 因为无论出队还是入队,都要进行求余运算,将队首指针和队尾指针转化为有效的顺序队下标值,另外,循环顺序队中的元素可以平行移动,所以本叙述是正确的

四、简答题

  1. 可能的次序为CDBAE、CDEBA、CDBEA
  2. 高级语言变量名的定义规则是:以字母开头的字母数字串。入栈次序为123PA,以A最先出栈的序列为AP321,以P最先出栈的序列为P321A,P32A1,P3A21,PA321。所以可以作为高级语言的变量名的序列为AP321,P321A,P32A1,P3A21,PA321。
  3. 1)能得到输出顺序为325641的序列,其操作序列为:AAADDAADADDD
    2) 不能得到输出顺序为154623的序列;执行ADAAAADDAD,得到输出序列1546后,栈中元素从栈顶到栈底为32,不能让2先出栈,所以得不到输出序列154632。
  4. 证明过程如下图所示:
    在这里插入图片描述
  5. 证明过程如下图所示:
    在这里插入图片描述

五、计算题

  1. 设置一个栈st,扫描表达式exp,遇到‘(’、‘[’、‘{’,则将其入栈,遇到‘)’,若栈顶是‘(’,则继续处理,否则以不匹配返回0;遇到‘]’,若栈顶是‘[’,则继续处理,否则以不匹配返回0;遇到‘}’,若栈顶是‘{’,则继续处理,否则以不匹配返回0;在exp扫描完毕后,若栈不空,则以不配对返回0;否则以括号配对返回1.对应算法如下:
int match(char exp[],int n)
{
	char st[MaxSize];
	int top=-1;
	int i=0,tag=1;
	while(i<n && tag==1)
	{
		if(exp[i]=='(' || exp[i]=='[' ||exp[i]=='{')
		{
			top++;
			st[top]=exp[i];			
		}
		if(exp[i]==')')
		{
			if(st[top]=='(')
				top--;
			else
				tag=0;
		}
		if(exp[i]==']')
		{
			if(st[top]=='[')
				top--;
			else
				tag=0;
		}
		if(exp[i]=='}')
		{
			if(st[top]=='{')
				top--;
			else
				tag=0;
		}
		i++;
	}
	if(top>=0)
		tag=0;

	return tag;
}
  1. 过程如下:
    在这里插入图片描述
    Void process(int m, int a[],int curp)
    为了简单,栈运算只设计了基本的处理过程。完整程序如下
#include<stdio.h>
#define MaxSize 10
struct stacknode
{
	int data[MaxSize];
	int top;
}st;

int total = 4;
char str[] = "1234";
int sum = 0;

void initstack()
{
	st.top = -1;
}
void push(int n)
{
	st.top++;
	st.data[st.top] = n;
}
int pop()
{
	int temp;
	temp = st.data[st.top];
	st.top--;
	return temp;
}
bool empty()
{
	if (st.top == -1)
		return true;
	return false;
}
void process(int m, int a[], int curp)
{
	int x, i;
	if (m > total && empty())
	{
		printf(" ");
		for (i = 0; i < curp; i++)
			printf("%c ", str[a[i] - 1]);
		printf("\n");
		sum++;
	}
	if (m <= total)
	{
		push(m);
		process(m + 1, a, curp);
		pop();
	}
	if (!empty())
	{
		x = pop();
		a[curp] = x;
		curp++;
		process(m, a, curp);
		push(x);
	}
}
void main()
{
	int a[MaxSize];
	initstack();
	printf("所有出栈序列:\n");
	process(1, a, 0);
	printf("出栈序列个数%d\n", sum);
}

该程序的执行结果如下:
在这里插入图片描述
3. 解析过程如下:
在这里插入图片描述

typedef struct{
	ElemType S[MaxSize];
	int top1,top2;
}StackType;

void InitStack1(StackType &st)
{
	st.top1=-1;
	st.top2=MaxSize;
}
int StackEmpty1(StackType st,int i)//i==1 栈1   i==2 栈2
{
	if(i==1)//i==1
		return (st.top==-1);
	else//i==2
		return (st.top==MaxSize);
}
int Push1(StackType &st,int i,ElemType x)
{
	if (st.top1==st.top2-1)
	{
		return 0;
	}
	if(i==1)//栈1
	{
		st.top1++;
		st.S[st.top1]=x;
	}
	else//栈2
	{
		st.top2--;
		st.S[st.top2]=x;
	}
	else//参数错误
		return 0;
	return 1}
int Pop1(StackType &st, int i,ElemType &x)
{
	if(i==1)
	{
		if(st.top1==-1)
			return 0;
		else
		{
			x=st.S[st.top1];
			st.top1--;
		}
	}
	else if(i==2)
	{
		if(st.top2==MaxSize)
			return 0;
		else
		{
			x=st.S[st.top2];
			st.top2++;
		}
	}
	else
		return 0;
	return 1;
}

4.假定采用顺序栈结构,先退栈st中所有元素,利用一个临时栈tmps存放从st栈中退栈的元素,最后的一个元素即为所求,然后将临时栈tmps中的元素逐一出栈并进栈到st中,这样恢复st栈中原来的元素。相关代码如下:

int GetBottom(SqStack st,ElemType &x)
{
	ElemType e;
	SqStack tmpst;
	initstack(tmpst);
	if (StackEmpty(st))
	{
		return 0;
	}
	while(!StackEmpty(st))
	{
		Pop(st,x);
		Push(tmpst,x);
	}
	while(!StackEmpty(tmpst))
	{
		Pop(tmpst,x);
		Push(st,e);
	}
	return 1;
}

5.代码如下

#include <stdio.h>
#include <malloc.h>
typedef struct qnode
{
    int data;
    struct qnode *next;
} QNode;            /*链队结点类型*/

typedef struct
{
    QNode *front,*rear;
} QuType;           /*链队类型*/

void SeeDoctor()
{
    int sel,flag=1,find,no;
    QuType *qu;
    QNode *p;
    qu=(QuType *)malloc(sizeof(QuType));    /*创建空队*/
    qu->front=qu->rear=NULL;
    while (flag==1)                             /*循环执行*/
    {
        printf("1:排队 2:就诊 3:查看排队 4.不再排队,余下依次就诊 5:下班  请选择:");
        scanf("%d",&sel);
        switch(sel)
        {
        case 1:
            printf("  >>输入病历号:");
            do
            {
                scanf("%d",&no);
                find=0;
                p=qu->front;
                while (p!=NULL && !find)
                {
                    if (p->data==no)
                        find=1;
                    else
                        p=p->next;
                }
                if (find)
                    printf("  >>输入的病历号重复,重新输入:");
            }
            while (find==1);
            p=(QNode *)malloc(sizeof(QNode));   /*创建结点*/
            p->data=no;
            p->next=NULL;
            if (qu->rear==NULL)                 /*第一个病人排队*/
            {
                qu->front=qu->rear=p;
            }
            else
            {
                qu->rear->next=p;
                qu->rear=p; /*将*p结点入队*/
            }
            break;
        case 2:
            if (qu->front==NULL)                /*队空*/
                printf("  >>没有排队的病人!\n");
            else                                /*队不空*/
            {
                p=qu->front;
                printf("  >>病人%d就诊\n",p->data);
                if (qu->rear==p)            /*只有一个病人排队的情况*/
                {
                    qu->front=qu->rear=NULL;
                }
                else
                    qu->front=p->next;
                free(p);
            }
            break;
        case 3:
            if (qu->front==NULL)            /*队空*/
                printf("  >>没有排列的病人!\n");
            else                            /*队不空*/
            {
                p=qu->front;
                printf("  >>排队病人:");
                while (p!=NULL)
                {
                    printf("%d ",p->data);
                    p=p->next;
                }
                printf("\n");
            }
            break;
        case 4:
            if (qu->front==NULL)            /*队空*/
                printf("  >>没有排列的病人!\n");
            else                            /*队不空*/
            {
                p=qu->front;
                printf("  >>病人按以下顺序就诊:");
                while (p!=NULL)
                {
                    printf("%d ",p->data);
                    p=p->next;
                }
                printf("\n");
            }
            flag=0;                         /*退出*/
            break;
        case 5:
            if (qu->front!=NULL)            /*队不空*/
                printf("  >>请排队的病人明天就医!\n");
            flag=0;                     /*退出*/
            break;
        }
    }
    p=qu->front;  //销毁队列
    while (p!=NULL)
    {
        q = p->next;
        free(p);
        p = q;
    }
}

int main()
{
    SeeDoctor();
    return 0;
}

运行结果如下:

在这里插入图片描述

六、说明

本人已毕业多年,读研时撰写了一份 《数据结构与算法分析(C++语言版)_张琨版 课后习题答案》,每年依旧有大量考研的学弟学妹们来找这份答案,现将其公布在blog上,仅供学术交流,上述解答如有问题,可私信沟通。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵卓不凡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值