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

    0.PTA得分截图

    1.本周学习总结(0-4分)

    1.1 总结栈和队列内容

    一、栈

    (1)栈的定义:
    栈也是属于线性表,但其拥有着先进后出的特点,且指针不能随意走动。如图:

    (2)如何定义一个栈:
    C语音:

    typedef struct sta
    {
        int Date[MaxSize];  
        int top;  //栈顶指针         
    }stack;
    

    C++:

    stack<char>st;//C++有专门的stack容器来使用栈
    

    (3)栈的操作
    建立一个新栈:

    void InitStack(Stack &s)
    {
      s=new Stack;     
      s->top=-1;//栈顶指针指在栈顶元素位置,为-1时表示栈空
    }
    

    入栈:

    bool PushStack(sqStack &s,int e)
    {
        if(s->top==MaxSize-1)
        {
            return false;
        }
        s->Date[++s->top]=e;
        return true;
    }
    

    出栈:

    bool PopStack(sqStack &s,int &e)
    {
        if(s->top==-1)
        {
            printf("栈空
    ");
            return false;
        }
        e=s->Date[s->top--];
        return true;
    }
    

    取栈顶:

    bool GetTop(sqStack &s,int &e)
    {
        if(s->top==-1)
        {
            return false;
        }
        e=s->Date[s->top];
        return true;
    }
    

    销毁:

    void DestroyStack(SqStack &s)
    {
        delete s;
    }
    

    (4)栈的应用:
    利用栈的性质,可以利用栈来实现符号配对,如:

    #include<iostream>
    #include<string>
    #include<stack>
    #include<map>
    using namespace std;
    
    bool IsMatch(string str, char& topChar);
    
    int main()
    {
    	string str;
    	char topChar=0;
    
    	cin >> str;
    
    	if (IsMatch(str, topChar))
    	{
    		cout << "yes";
    	}
    	else if (topChar)
    	{
    		cout << topChar << endl << "no";
    	}
    	else
    	{
    		cout << "no";
    	}
    
    	return 0;
    
    }
    
    bool IsMatch(string str, char& topChar)
    {
    	int i;
    	int strLen=str.size();
    	stack<char>st;
    	map<char, char>mp;
    	mp[')'] = '(';
    	mp[']'] = '[';
    	mp['}'] = '{';
    
    	for(i=0;i<strLen;i++)
    	{
    		if (str[i] == '(' || str[i] == '[' || str[i] == '{')
    		{
    			st.push(str[i]);
    		}
    		else if(str[i] == ')' || str[i] == ']' || str[i] == '}')
    		{
    			if (st.empty())
    			{
    				return false;
    			}
    
    			if (mp[str[i]] == st.top())
    			{
    				st.pop();
    			}
    			else
    			{
    				return false;
    			}
    		}
    	}
    
    	if (!st.empty())
    	{
    		topChar = st.top();
    		return false;
    	}
    
    	return true;
    }
    

    二、队列:
    (1)队列的定义:
    队列与栈有着许多相似的地方,如:都是线性表,都不能随意移动指针。但队列也有与栈不同的地方,队列是先进先出,如下图:

    (2)如何定义一个队列

    struct Queue {
        ElementType *Data;  
        Position Front;     
        Position rear;       
        int MaxSize;
    };
    

    (3)队列的操作
    建立一个新队列:

    void InitQueue(sqQueue &Q)
    {  
        Q=new Queue;  
        Q->front=-1;
        Q->rear=-1;  
    }  
    

    入队:

    bool enQueue(sqQueue &Q,ElementType e)
    {
        if(Q->rear==MaxSize-1)
        {
            return false;
        }
        Q->Date[++Q->rear];
        return true;
    }
    

    出队

    bool deQueue(sqQueue &Q,ElementType e)
    {
        if(Q->front==Q->rear)
        {
            return false;
        }
        e=Q->date[++Q->front];
        return true;
    }
    

    销毁:

    void DestroyQueue(SqQueue &Q)
    {
        delete Q;
    }
    

    (4)队列的应用
    运用队列的性质,可以实现如舞伴问题、报数游戏等程序。

    1.2.谈谈你对栈和队列的认识及学习体会。

    栈和队列有着自己独特的特点,如果能灵活地运用,能够轻松的完成一些代码的实现,前提是要对其性质及实现方法有较深的理解与认识。通过这阶段的学习,现在已经对栈与队列的原理有着自己的理解,希望通过以后的学习,将本部分知识同以后的知识能更好的结合起来,写出更好的代码。

    2.PTA实验作业(0-2分)

    选2道PTA题目,不写伪代码,只贴代码截图,并记录代码提交碰到问题及解决方法。不得选栈或队列操作(选,则为0分)选择难度越高题目得分越高。

    2.1.题目1:字符串是否对称

    2.1.1代码截图


    2.1.2本题PTA提交列表说明。

    2.2 题目2:符号配对

    2.2.1代码截图


    2.2.2本题PTA提交列表说明。

    3.阅读代码(0--4分)

    3.1 题目及解题代码


    3.1.1 该题的设计思路

    通过栈来模拟出栈的过程,从而判断是否为正确

    3.1.2 该题的伪代码

    for(遍历输入)
    {
    push(数字)
    while(栈不空且输出没有遍历完且栈顶==输出)
    {
    出栈
    }
    返回栈是否为空
    }

    3.1.3 运行结果

    3.1.4分析该题目解题优势及难点。

    该题目考查的是逆向思维,给你输入顺序,叫你判断输出顺序是否正确,解题关键要从输出入手。再来模拟输入。

    3.2 题目及解题代码

    3.2.1 该题的设计思路

    先排身高更高的,防止后排入人员影响先排入人员位置
    每次排入新人员[h,k]时,已处于队列的人身高都>=h,所以新排入位置就是people[k]

    3.2.2 该题的伪代码

    先将people按照身高降序排序,相同身高需要按k升序排序
    使用list作为中间容器
    for(循环插入)
    {
    将元素插入到list容器中
    }
    重建vector返回

    3.2.3 运行结果

    3.2.4分析该题目解题优势及难点。

    巧妙地将数据进行预处理,提前按照身高排了一次序,对往后的排序有很大帮助。难点:两个条件有相互制约的情况。

  • 相关阅读:
    在局部场景中重新定位 Revit 数据
    MP.PDFDocumentCreate
    ArcGIS Pro在 ModelBuilder 中使用逻辑工具的示例 如果数据已存在
    【Arcpy学习实践教程】wgs84坐标系和火星坐标系的转换中demo的对与错
    ArcGIS Pro更新和修复数据源
    ArcGIS API for Python和ArcPy区别
    使用ArcGISPro操作multipatch数据(转)
    arcpy自动制图实战(arcpy.mapping迁移至arcpy.mp)(转)
    pro Camera
    arcgis pro ArcGISProject
  • 原文地址:https://www.cnblogs.com/Guangyang/p/12546829.html
Copyright © 2011-2022 走看看