zoukankan      html  css  js  c++  java
  • DS博客作业02--栈和队列

    0.PTA得分

    1.本周学习总结

    1.1栈

    顺序栈的结构、操作函数

    0.顺序栈的结构体定义

    typedef struct{
      	ElemType data[MAXSIZE];
      	int top;
      }Stack,*SqStack;
    

    1.进栈操作

    bool Push (SqStack &s,ElemType e)
    {
    	if(S-top==MAXSIZE-1)
    	{
    		return false;//栈满返回false 
    	}
    	s->top++;
    	s->data[s->top]=e;
    	retrun true;
     } 
    

    2.取栈顶元素操作

    bool Get top(SqStack &s,ElemType &e)
     {
     	if(s->top==-1)
     	return false;//栈空返回false 
     	e=s->data[s->top];
    	 return true; 
      } 
    

    3.出栈操作

    bool Pop(SqStack &s,ElemType &e)
      {
      	if(s->top==-1)
     	return false;//栈空返回false 
     	e=s->data[s->top];
     	s->top--;
     	return true;
      }
    

    链栈的结构、操作函数

    0.链栈结构体定义

    typedef struct linkstack
    {
        ElemType data;
        struct linkstack *next;
    }StStack,*LinkStack;
    

    1.进栈操作

    bool Push(LinkStack &S, int e) //在栈顶插入元素e
    {
        LinkStack p;
        p = new Snode; //生成新结点
        p->data = e; //将e放在新结点数据域
        p->next = S; //将新结点的指针域指向S
        S = p; //修改栈顶指针为p
        return true;
    }
    

    2.取栈顶元素

    int GetTop(LinkStack S) //返回S的栈顶元素
    {
        if (S != NULL) 
            return S->data; //返回栈顶元素的值
        else
            return -1;
    }
    

    3.出栈

    bool Pop(LinkStack &S, int &e) 
    {
        LinkStack p;
        if (S == NULL) 
            return false;
        e = S->data;
        p = S;
        S = S->next;
        delete p; //释放原栈顶元素的空间
        return true;
    }
    

    1.2栈的应用

    1.输入之后逆序输出

    2.语法检查:括号匹配

    每当扫描到大中小的括号后,令其进栈,当扫描到右括号时,则检查栈顶是否为相应的左括号,若是,则出栈处理,若不是,则出现了语法错误。当扫描到文件结尾,若栈为空则表明没有发现括号配对错误。

    1.3队列

    顺序队列的结构、操作函数
    0.队列的定义

    typedef struct Squeue
    {
    	DataType queue[QueueSize];
    	int front, rear;
    }SeqQueue;
    

    1.入列

    bool EnQueue(SeqQueue *S, DataType e)
    {
    	if (S->front==(S->rear+1)%QueueSize)
    	{
    		return false;
    	}
            S->rear ++;
    	S->queue[S->rear] = e;	
    	return true;
    }
    

    2.出列

    bool DeQueue(SeqQueue *S, DataType &e)
    {
    	if (S->front==S->rear)
    	{
    		return false;
    	}
    	else
    	{
    		S->front++;
    		e = S->queue[S->front];
    		return true;
    	}
    }
    

    3.判断队列是否为空

    bool QueueEmpty(SeqQueue *S)
    {
    	if (S->front==S->rear)
    	{
    		return false;
     
    	}
    	else
    	{
    		return true;
    	}
    }
    

    链队列的结构、操作函数
    0.定义

    typedef int QElemType;
    
    typedef struct QNode
    {
    	QElemType data;
    	struct QNode *_pNext;
    }QNode;
    
    typedef struct LQueue
    {
    	QNode *pFront;
    	QNode *pRear;
    }LQueue;
    

    1.入列

    void enQueue(LQueue*&q,QElemType data)
    {
    	Qnode*p;
    	p=(Qnode*)malloc(sizeof(Qnode));
    	p->data=data;
    	p->_pNext=NULL;
    	
    	if(q->pRear==NULL)
    		q->ppFront=q->pRear=p;//若队列为空,新节点是头又是尾
    	else
    		{
    			q->pRear->_pNext=p;
    			q->pRear=p;
    		}
    	
    }
    

    3.出列

    bool deQueue(LQueue*&q,QElemType &data)
    {
    	Qnode *t;
    	if(q->pRear==NULL)
    	{
    		return false;
    		
    	}
    	t=q->pFront;
    	 if(q->pFront==q->pRear)
    	 {
    	 	q->pFront=q->pRear=NULL;
    	 }
    	 else
    	 	q->pFront=q->pFront->next;
    	data=t->data;
    	free(t);
    	return true;
    }
    

    3.判断队列是否为空

    bool Emptyqueue(LQueue *q)
    {
        return(q->pRear==NULL);
    }
    

    1.3队列的应用

    队列是一种常见的数据结构,主要的特性先进来的元素会先出去,所以适合具有这个特性的算法来使用,比如图的广度优先搜索、二叉树的层次遍历等。
    所以队列和生活中的排队非常相似,先来的先服务,后来的后服务。

    2.PTA实验作业

    2.1符号配对

    符号配对(https://gitee.com/lin-dachun/code/blob/master/符号配对)

    2.1.1 解题思路:

    将字符一个一个处理,发现一个要处理的左符号“[,(,{”就入栈,发现一个需要处理的右符号“],),}”就与栈顶对比。
    如果是对应的左符号,那么把栈顶弹出,否则说明这个右符号不能配对,输出NO等信息并退出。如果一直处理到程序结尾都没有退出就是YES。

    2.1.2 总结解题所用的知识点

    stack库的操作

    2.2 银行业务队列简单模拟

    代码地址(https://gitee.com/lin-dachun/code/blob/master/银行业务模拟)

    2.2.1解题思路:

    模拟队列,将偶数的数字存到b窗口,将奇数的数字存到a窗口,而且是先进先出,所以可以采用队列,将偶数的放在b队列,将奇数的放在a队列;然后每输出两个a队列中的元素,再输出一个b队列中的元素;

    2.2.2总结解题所用的知识点

    queue库的操作

    3.阅读代码

    3.1题目及解题代码

    int *dailyTemperatures(int *T, int TSize, int *returnSize)
    {
        int *monoStack = (int *)malloc(sizeof(int) * TSize);
        memset(monoStack, 0, sizeof(int) * TSize);
        int stackTop = -1;
        int tIter = 0;
    
        int *res = (int *)malloc(sizeof(int) * TSize);
        memset(res, 0, sizeof(int) * TSize);
    
        while (tIter < TSize) {
            /* monoStack[stackTop]是栈顶元素在T中的下标,T[monoStack[stackTop]] 才是真正的栈顶温度 */
            while (stackTop != -1 && T[monoStack[stackTop]] < T[tIter]) {
                int r = monoStack[stackTop];
                stackTop--;
                
                res[r] = tIter - r;
            }
            monoStack[++stackTop] = tIter++;        
        }
        *returnSize = TSize;
        return res;
    }
    

    3.2 该题的设计思路

    1.构造一个单调递减栈,当遇到比栈顶元素大的温度,就要考虑出栈
    2.单调栈中,存入的是每日温度的下标,当发现更高的温度时,栈顶元素monoStack[stackTop]和当前元素下标tIter相减,即为天数差

    3.3该题目解题优势及难点

    运用了单调栈的套路

  • 相关阅读:
    [HEOI2013]Segment
    决策单调性胡扯笔记
    HDU 4352 XHXJ's LIS
    WC前计划做但一定会鸽的事情
    LGP5667 拉格朗日插值2
    BZOJ3516 国王奇遇记加强版
    ### Paper about Event Detection
    ### GIT
    ###《Max-Margin Early Event Detectors》
    ### matlab
  • 原文地址:https://www.cnblogs.com/rryy2001/p/14619826.html
Copyright © 2011-2022 走看看