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分析该题目解题优势及难点。
巧妙地将数据进行预处理,提前按照身高排了一次序,对往后的排序有很大帮助。难点:两个条件有相互制约的情况。