肇砖oj题,仅供参考,不怕被钟sir封号三周你就抄
编写一个 stack 栈类,约定:
1. 封装数据和操作
2. 数据成员为私有属性,包括:
-
data :保存栈内元素,栈元素类型为 int
-
t : 指示栈顶位置
-
len : 当前栈空间的大小
3. 成员函数为公有属性,包括:
-
默认构造函数,完成初始化动作,栈的默认大小是 1000 。最后输出一行:constructing
-
析构函数只输出一行:destructing
-
top( &v ),函数返回如果为真,参数 v 带回栈顶元素的值;函数返回如果为假,参数 v 的值没有变化
-
pop(),如果栈不空,弹走栈顶元素;如果栈空,没有动作
-
push( v ),如果栈已满,没有动作;如果栈未满,参数 v 的值进栈
-
size(),返回当前栈内元素个数,如果栈空,返回 0
-
output(),自栈底到栈顶,输出栈内元素,每一个元素后面跟一个空格,作为分隔。最后换行。如果栈空,没有输出
多条命令,每种命令定义如下:
-
1 a :表示把元素 a 压入栈
-
2 :表示弹走栈顶元素
-
3 :表示读取栈顶元素的值
-
4 :表示输出当前栈内元素的个数
-
5 :表示调用 output() 函数
输入的第一行是命令的数量 n
接下来 n 行,每行是一条命令
对第 3、4、5 类命令,输出一行:该命令对应取得的结果
10
1 3
1 5
1 7
3
2
4
2
1 9
5
3
constructing <---- 默认构造函数输出
7 <---- 当前栈顶元素是7
2 <---- 弹走了7,所以只剩下2个元素
3 9 <---- 弹走了5,压入了9,所以栈内的元素是3,9
9 <---- 栈顶元素是9
destructing <---- 析构函数输出
下面这个测似用例是容易错的情况:
5
1 3
2
2 <---- 这里容易错,就是栈空时调用pop()
3 <---- 这里也容易错,就是栈空时调用top()
5 <---- 这里也容易错,就是栈空时调用output()
输出结果:
1 3
2
2 <---- 这时栈空,pop()无需任何动作
3 <---- 这时栈空,top()函数返回值应该是false。如果这里输出了内容,就是错了
5 <---- 这里栈空,output()无需输出任何内容
#include<iostream>
#include<cstdlib>
using namespace std;
class stack{
private:
int top,len;
int data[1000];
public:
stack (){
int *data=new int[10];
top=-1,len=0;
cout<<"constructing"<<endl;
}
void push(int n){
top++,len++;
data[top]=n;
//cout<<data[top]<<endl;
}
void gettop(){
if(len<=0) return;
cout<<data[top]<<endl;
}
void pop(){
if(len<=0) len=0;
else {
len--;
data[top]=-1111;
top--;
}
}
void size(){
cout<<len<<endl;
}
void output(){
int n;
if(len<=0) return;
else{
for(n=0;n<len;n++)
cout<<data[n]<<" ";
cout <<endl;}
}
~stack(){
// delete[]data;
cout<<"destructing"<<endl;
}
};
int main(){
stack s;
int num,i,ch;
cin>>num;
for(i=1;i<=num;i++){
cin>>ch;
if(ch==1){
int j;
cin>>j;
s.push(j);
}
if(ch==2) s.pop();
if(ch==3) s.gettop();
if(ch==4) s.size();
if(ch==5) s.output();
}
}