栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数据结构习题集(二)—— 栈,队列,数组

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构习题集(二)—— 栈,队列,数组

文章目录
  • 第2章 栈,队列,数组
    • 2.4 单链表表头指针h,判断该链表前个字符是否中心对称
    • 2.5 S1,S2为共享存储区[0,Maxsize]的顺序栈,栈顶相向,迎面增长;设计S1和S2有关入栈和出栈的算法
    • 2.6 为利用循环队列空间,设置标志域tag以区分队头指针front和队尾指针rear相同时队列的状态是“空”还是“满”,写出对应的入队和出队算法
    • 2.7 Q是队列,S是空栈,将队列中的元素逆置
    • *2.8 用两个栈模拟一个队列

第2章 栈,队列,数组 2.4 单链表表头指针h,判断该链表前个字符是否中心对称
bool dc(LinkLNode *h,int n) {
    char s[n/2];	//存放前 n/2 个元素入栈
    int i;
    LinkLNode *p = h->next;
    for(i = 0;i < n / 2;i++) {
        s[i] = p->data;
        p = p->next;
    }
    i--;
    if(n % 2 == 1)		//如果n是奇数,跳过中心位置
        p = p->next;
    while(p != NULL && p->data == s[i]) {
		i--;
        p = p->next;
    }
    if(i == -1)
        return true;
    else
        return false;
}
2.5 S1,S2为共享存储区[0,Maxsize]的顺序栈,栈顶相向,迎面增长;设计S1和S2有关入栈和出栈的算法

typedef struct {
    int top[2];
    int stack[Maxsize];
}Stack;

Stack s;

// 入栈
Status Push(int id,ElemType x) {
	if(id != 1 || id != 2) {	//栈号不对
        perror("栈号错误n");
        return ERROR;
    }
    
    if(s.top[1] - s.top[0] == 1) {	//栈满
     	perror("栈满n");
        return ERROR;
    }
    
    switch(id){
      	case 1:
            s.stack[++s.top[0]] = x;
            return OK;
            break;
        case 2:
            s.stack[--s.top[1]] == x;
            return OK;
            break;
    }
}


// 出栈
Status Pop(int id,ElemType &x) {
    if(id != 1 || id != 2) {	//栈号不对
        perror("栈号错误n");
        return ERROR;
    }
    switch(id){
        case 1:
            if(s.top[0] == -1) {
                perror("S1已空n");
                return ERROR;
            }
            else {
                x = s.stack[s.top[0]];
                s.top[0] --;
                return OK;
            }
            break;
        case 2:
            if(s.top[1] == Maxsize) {
                perror("S2已空n");
                return ERROR;
            }
            else{
                x = s.stack[s.top[1]];
                s.top[1]++;
                return OK;
            }
            break
    }
}
2.6 为利用循环队列空间,设置标志域tag以区分队头指针front和队尾指针rear相同时队列的状态是“空”还是“满”,写出对应的入队和出队算法

struct SqQueue{
    int front;
    int rear;
    bool tag;
    ElemType data[Maxsize];
}

// 入队
Status EnQueue(SqQueue &Q,ElemType x) {
    if(Q.front == Q.rear && tag = 0)		//队满
        return ERROR;
    Q.data[Q.rear] = x;
    Q.rear = (Q.rear + 1)%Maxsize;
    Q.tag = 1;
    return OK;
}

// 出队
Status DeQueue(SqQueue &Q,ElemType &x) {
    if(Q.front == Q.rear && tag = 0)		//队空
        return ERROR;
    x = Q.data[Q.front];
    Q.front = (Q.front + 1)%Maxsize;
    Q.tag = 0;
    return OK;
}
2.7 Q是队列,S是空栈,将队列中的元素逆置
void reverse(Queue &Q,Stack S){
    while(!QueueEmpty(Q)){
        DeQueue(Q,x);	//队列中元素出队
        Push(S,x);		//依次入栈
    }
    while(!StackEmpty(S)) {
        Pop(S,x); 		//出栈
        EnQueue(Q,x);	//依次入队
    }
}
*2.8 用两个栈模拟一个队列

已知栈的四个运算定义如下:

  • Push(S,x) //元素x入栈S

  • Pop(S,x) //S出栈,并将出栈的值赋给x

  • StackEmpty(S) //判断栈是否为空

  • StackOverflow(S) //判断栈是否满

实现EnQueue(),DeQueue(),QueueEmpty()

 


Status EnQueue(Stack &S1,Stack &S2,ElemType x) {
    if(!StackOverflow(S1)) {	// S1未满
        Push(S1,x);			//正常入栈
        return OK;
    }
    if(StackOverflow(S1) && !StackEmpty(S2))	//S1满,S2非空,不能入队
        return ERROR;
    if(StackOverflow(S1) && StackEmpty(S2)) {		//S1满,S2空,把S1全部插入S2,再入队
    	while(!StackEmpty(S1)) {
            Pop(S1,temp);
            Push(S2,temp);
        }
        Push(S1,x);
        return OK;
    }
}


Status DeQueue(Stack &S1, Stack &S2,ElemType &x) {
    if(StackEmpty(S2) && StackEmpty(S1))		//栈均为空,不能出队
        return ERROR;
    if(!StackEmpty(S2)) {		//S2非空,直接出队
        Pop(S2,x);
        return OK;
    }
    if(StackEmpty(S2) && !StackEmpty(S1)){		//S2为空,S1非空,把S1全部插入S2
        while(!StackEmpty(S1)){
            Pop(S1,temp);
            Push(S2,temp);
        }
        Pop(S2,x);
        return OK;
    }
}


bool QueueEmpty(Stack S1,Stack S2){
    if(!StackEmpty(S1) && !StackEmpty(S2))
        return true;
    return false;
}
  if(StackEmpty(S2) && StackEmpty(S1))		//栈均为空,不能出队
        return ERROR;
    if(!StackEmpty(S2)) {		//S2非空,直接出队
        Pop(S2,x);
        return OK;
    }
    if(StackEmpty(S2) && !StackEmpty(S1)){		//S2为空,S1非空,把S1全部插入S2
        while(!StackEmpty(S1)){
            Pop(S1,temp);
            Push(S2,temp);
        }
        Pop(S2,x);
        return OK;
    }
}


bool QueueEmpty(Stack S1,Stack S2){
    if(!StackEmpty(S1) && !StackEmpty(S2))
        return true;
    return false;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/971468.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号