7-4 队列操作 (20 分)

请实现一个MyQueue类,实现出队,入队,求队列长度.

实现入队函数 void push(int x); 实现出队函数 int pop(); 实现求队列长度函数 int size();

输入格式:

每个输入包含1个测试用例。每个测试用例第一行给出一个正整数 n (n <= 10^6) ,接下去n行每行一个数字,表示一种操作: 1 x : 表示从队尾插入x,0<=x<=2^31-1。 2 : 表示队首元素出队。 3 : 表示求队列长度。

输出格式:

对于操作2,若队列为空,则输出 “Invalid”,否则请输出队首元素。 对于操作3,请输出队列长度。 每个输出项最后换行。

输入样例:

5
3
2
1 100
3
2

输出样例:

0
Invalid
1
100

老师提示:

THE FIRST:

#include<iostream>

using namespace std;
class MyQueue
{
	private:
		 int val ;
		static int front;//the first
		static int rear;//the last
		MyQueeu()
		{
			val =0;
		}
	public:
		void push(int x);
		void pop();
		friend int size();
};
int front = 0;
int rear = 0;
void MyQueue :: push(int x)
		{
			rear++;
			val = x;
		}
int size()
		{
			return rear - front;
		}
void MyQueue :: pop()
		{
			if(front == rear) 
			{
				cout <<"Invalid"<<endl;
			}
			else
			{
				
			cout<<val<<endl;
			front++;	
			}	
		 } 



int main()
{
	int n;
	cin>>n;
	MyQueue s[n];
	for(int i = 0; i < n; i++)
	{
		int num;
		cin>>num;
		switch(num)
		{
			case 1:
				{
					int x;
					cin>>x;
					s[rear].push(x);
					break;
				}
			case 2:
				{
					s[front].pop();
					front++;
					break;
				}
			case 3:
				{
					cout<<size()<<endl;
					break;
				}
		}
	}
 } 

 

 1.把实例化对象数组改为在类内创建数组;那么val[],front,rear不用再声明为静态数据成员,因为整个程序中只实例化了一个对象,自始至终只使用对象s内存中的数据成员

2.静态数据成员的初始化方式:类型说明符 类名::静态数据成员 = 初始值;

3.a++表示原先a的值,++a表示a的值加1

#include<iostream>

using namespace std;
class MyQueue
{
	private:
		static int val[1000] ;
		static int front;//the first
		static int rear;//the last
		MyQueeu()
		{
			
		}
	public:
		void push(int x);
		int pop();
		 int size();
};
int MyQueue::front = 0;
int MyQueue::val[1000]{0} ;
int MyQueue::rear = 0;
void MyQueue :: push(int x)
		{
			
			val[rear] = x;
			rear++;
		}
int  MyQueue :: size()
		{
			return rear - front;
		}
int MyQueue :: pop()
		{
			if(front == rear) 
			{
				return -1;
			}else
			{
				return val[++front];
			}	
		 } 



int main()
{
	int n;
	cin>>n;
	MyQueue s;
	int num;
	int x;
	for(int i = 0; i < n; i++)
	{
		
		cin>>num;
		switch(num)
		{
			case 1:
				{
					cin>>x;
					s.push(x);
					break;
				}
			case 2:
				{
					if(s.pop() == -1)
					{
						cout<<"Invalid"<<endl;
					}else
					cout <<s.pop()<<endl;
					break;
				}
			case 3:
				{
					cout<<s.size()<<endl;
					break;
				}
		}
	}
 } 

1.push()函数正常存入 ,pop()函数if的判断没有问题,在pop()成员函数内输出val[front++]时没有问题;switch中已经调用一次pop()成员函数,在case

2:中再次调用回事front的值为下一位,改为在case 2:的执行体中加入front++;但先前将front声明为类的私有成员,不能再类外使用,改为将front设置为全局变量;在case 2:的执行体中将x = pop(),即x = val[front++];

在dev中成功实现样例,但在pta中显示编译错误

#include<iostream>
#include<cstring>

using namespace std;
class MyQueue
{
	private:
		int val[1000] ;
		int front = 0;//the first
		int rear;//the last
		MyQueeu()
		{
			
		}
	public:
		void push(int x);
		int pop();
		 int size();
};
void MyQueue :: push(int x)
		{
			
			val[rear] = x;
			rear++;
		}
int  MyQueue :: size()
		{
			return rear - front;
		}
int MyQueue :: pop()
		{
			if(front == rear) 
			{
				return -1;
			}else
			{
				return val[front++];
			}	
		 } 



int main()
{
	int n;
	cin>>n;
	MyQueue s;
	int num;
	int x;
	for(int i = 0; i < n; i++)
	{
		cin>>num;
		switch(num)
		{
			case 1:
				
					cin>>x;
					s.push(x);
					break;
				
			case 2:
                    x = s.pop();
					if(x == -1)
					{
						cout<<"Invalid"<<endl;
					}else
					{
						cout <<x<<endl;
						break;
					}
					
				
			case 3:
					cout<<s.size()<<endl;
					break;
				
		}
	}
 } 

 无参构造函数位置错误,函数名错误,修改之后出现段错误;

#include<iostream>
#include<cstring>

using namespace std;
class MyQueue
{
	private:
		int val[1000] ;
		int front = 0;//the first
	public:
		void push(int x);
		int pop();
		 int size();
		 MyQueue();
};
  MyQueue::  MyQueue()
  {
  	
  }
void MyQueue :: push(int x)
		{
			val[front++] = x;
		}
int  MyQueue :: size()
		{
			return front;
		}
int MyQueue :: pop()
		{
			if(front == 0) 
			{
				return -1;
			}else
			{
                for(int i = 0; i < front-1; i++)
                {
                    val[i] = val[i+1];
                }
                front--;
				return val[0];
			}	
		 } 



int main()
{
	int n;
	cin>>n;
	MyQueue s;
	int num;
	int x;
	for(int i = 0; i < n; i++)
	{
		cin>>num;
		switch(num)
		{
			case 1:
				
					cin>>x;
					s.push(x);
					break;
				
			case 2:
				
                    x = s.pop();
					if(x == -1)
					{
						cout<<"Invalid"<<endl;
					}else
					{
						cout <<x<<endl;
					}
					break;
				
			case 3:
				
					cout<<s.size()<<endl;
					break;
				
		}
	}
 } 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值