03-栈和队列

1.学习总结

2.PTA实验作业

2.1题目一:7-2 jmu-字符串是否对称

2.2设计思路

对称函数

int symmetry(ElementType str[])
{
	定义指针变量s,并初始化;
        定义变量i,e; 
        for(字符串没有结束时)  
            入栈;  
        for(字符串没有结束时)  
        {  
            出栈;  
            if(str[i]!=e){
		   销毁s;	
            }   
        }  
        销毁s; 
}  

2.3代码截图

2.4PTA提交列表说明

第一次提交时,用的C提交的,导致编译错误;
第二次提交,pop函数里的参数e没有加引用符,导致一直只能输出no,后加上引用符就可以了。

2.1题目二:7-2 符号配对

2.2设计思路

配对函数

bool Match(Stack &s)
{
	定义变量 i = 0;
	定义字符串数组str;
	定义变量match,赋值为true;
	while(字符串没有结束时)){
		if(遇到.和)     结束;                             
		for(字符串没有结束时){   
			if(str[i] == '(' || str[i] == '[' || str[i] == '{')
			       入栈; 
			if(str[i] == '/' && str[i+1] == '*'){
			       入栈2次;
			       i加2;
			}
			if(str[i] == ')'){
				if(GetTop(s) == '(' && !StackEmpty(s))
				   	出栈;
				else{                                  
					结束, match赋值为false;
				}  
			}
			if(str[i] == ']'){                       
				if(GetTop(s) == '[' && !StackEmpty(s))
				   	出栈;
				else{                                  
					结束, match赋值为false;
				}  
			}
			if(str[i] == '}'){
				if(GetTop(s) == '{' && !StackEmpty(s))
				   	出栈;
				else{                                  
					结束, match赋值为false;
				}  
			}
			if(str[i] == '*' && str[i+1] == '/'){
				if(GetTop(s) == '*' && !StackEmpty(s)){
					出栈;
					if(GetTop(s) == '/' && !StackEmpty(s))
					       出栈;
					else{                               
						结束, match赋值为false;
					}   
				}                                     
				else{
				       结束
				}	   
			}
		}   
	}
    if(s不为空)
       match赋值为false;
       销毁s; 
       return match;  
}

2.3代码截图

2.4PTA提交列表说明

因为没有记录右符号,所以无法准确判断,所以我就加了个全局变量,用来存储右符号。

2.1题目三:7-2 银行业务队列简单模拟

2.2设计思路

主函数

int main(){
  定义队列queue变量
  定义变量n, i, j, e;
  for( i=0; i<n; i++){
  	输入e;
  	if(e是偶数)  入队A; 
  	else 入队B; 
  }
  for( i=0; i<n; i++){
        j赋值为0;
  	while( j<2){      
  	   j加1;
	   if( A不为空){
	       出队;
	       输出A;  
           }
       }
  	if( B不为空){  
	     出队;
	     输出B; 
         }
  }
  return 0;
}

2.3代码截图

2.4PTA提交列表说明

在while循环外面没有把j赋值为0,导致A队列只能输出前两个数;后在while循环外面加上j=0就可以了。

3.截图本周题目集的PTA最后排名

3.1栈PTA排名

3.2队列PTA排名

3.3我的总分:230

4. 阅读代码

4.1代码地址:https://gitee.com/wuyichengbi/codes/34j8wb6hlz0dpyrakeno299

4.2代码解析:

#include<cstdio>
#include<stack>
using namespace std;
const int maxn=1000+10;

int n,target[maxn];

int main()
{
  while(scanf("%d",&n)==1)
	{
		stack<int> s;
		int A=1,B=1;
		for (int i=1;i<=n;i++)                                      //输入目标序列 
			scanf("%d",&target[i]);
		int ok=1;
		while (B<=n)
		{
			if (A==target[B])                                    //”此时“B的值与目标序列是"此时"值相等,显然直接进栈出栈解决问题,两者下标都往后移
			{
				A++;
				B++;
			}
			else if (!s.empty()&&s.top()==target[B])
			{                                                           //如果栈顶元素与目标序列是"此时"值相等, 栈顶元素出栈解决问题
                                                                                      
				s.pop();
				B++;
			}
			else if (A<=n)                                       //如果还有可进栈元素,将其进栈
				s.push(A++);
			else
			{                                                           //该目标序列不可得到
				ok=0;
				break;
			}
		}
		printf("%s
",ok ? "Yes" : "No");
	}
	return 0;
}

4.3实现功能:使有n节车厢的的火车从A方向驶入,然后使其按特定的顺序进入B方向并驶出车站,可以借助中转站C。

5. 代码Git提交记录截图

原文地址:https://www.cnblogs.com/lixueting0904/p/8729498.html