#Z1015. [伴随编程] 手动实现一个栈
[伴随编程] 手动实现一个栈
这一节,我们动手来实现栈这个数据结构。为了便于代码复用和调试,我们通常会把数据结构封装起来——将栈写成一个struct,将当前栈的数据和对当前栈的操作都放在里面。
我们接下来定义一个结构体Stack,然后定义用来储存数据的数组int data[10000],这里开辟了固定容量的空间,在使用中超过限制就会发生溢出。因为我们把数组定义成了int,那么这个栈自然只能储存整数了。
然后,用一个top来指示现在栈顶的下标,那么data下标在 [1,top]的元素是在栈中的。初始的时候,栈中没有元素,top的值为 0。
- 首先,我们来实现push。push操作是把一个int类型的数据压入栈中,那么这个push的参数是一个int。将一个元素压入栈很简单,我们先让栈顶的位置top加 1,如果top 的值小于 10000,说明可以正常把插入的值赋值给栈顶位置即可,否则就超过了数组下标的范围。
请将push函数补全为:
void push(int x) { //1
top++; //1
if(top<10000){ //1
data[top]=x; //1
}else{ //1
top--; //1
cout <<"stack overflow" <<endl; //1
}
}
-
实现出栈pop操作。pop操作也很简单,只需要在 top 的值大于 0,即栈不为空时,让表示栈顶下标的变量自减 1 即可。注意,如果栈本身就是空的,就不要对栈任何操作了。想一想应该如何补全 pop 函数吧。
void pop() { //2 if(top>0){ //2 top--; //2 } }
-
栈除了push和pop这两个比较重要的操作,还有另外一个操作——获取当前栈顶元素的值。对于这个操作,我们只需访问data[top]就可以了。如果当前的栈为空,自然就不存在栈顶元素,说明该操作已非法,返回 -1。
请补全 topval 函数:
int topval() { //3
if(top > 0){ //3
return data[top]; //3
}else{ //3
return -1; //3
}
}
-
实现获取栈中元素个数的函数,显然元素个数为top。请你在topval函数下面写下一个返回值为 int 类型,没有参数,名称为 size 的函数,函数体中使用一句话返回 top 的值。
int size(){ //4 return top; //4 }
-
我们的栈已经写好了,代码已经定义一个Stack类型的变量,依次把 1 到 10 这十个整数压入栈中,输出栈中元素的数量后,又依次输出栈顶元素并将其弹出。
-
点击运行,你会发现输出和输入是反着的,这也是栈的先进后出的性质体现。