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("栈空\n");
        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分析该题目解题优势及难点。

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

posted @ 2020-03-22 16:42  ZGGYY  阅读(221)  评论(0编辑  收藏  举报