#Z1015. [伴随编程] 手动实现一个栈

[伴随编程] 手动实现一个栈

这一节,我们动手来实现栈这个数据结构。为了便于代码复用和调试,我们通常会把数据结构封装起来——将栈写成一个struct,将当前栈的数据和对当前栈的操作都放在里面。

我们接下来定义一个结构体Stack,然后定义用来储存数据的数组int data[10000],这里开辟了固定容量的空间,在使用中超过限制就会发生溢出。因为我们把数组定义成了int,那么这个栈自然只能储存整数了。

然后,用一个top来指示现在栈顶的下标,那么data下标在 [1,top]的元素是在栈中的。初始的时候,栈中没有元素,top的值为 0。

  1. 首先,我们来实现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
        }
    }
  1. 实现出栈pop操作。pop操作也很简单,只需要在 top 的值大于 0,即栈不为空时,让表示栈顶下标的变量自减 1 即可。注意,如果栈本身就是空的,就不要对栈任何操作了。想一想应该如何补全 pop 函数吧。

    	void pop() {			//2
            if(top>0){			//2
                top--;			//2
            }
        }
    
  2. 栈除了push和pop这两个比较重要的操作,还有另外一个操作——获取当前栈顶元素的值。对于这个操作,我们只需访问data[top]就可以了。如果当前的栈为空,自然就不存在栈顶元素,说明该操作已非法,返回 -1。

请补全 topval 函数:

	int topval() {				//3
        if(top > 0){			//3
            return data[top];	//3
        }else{					//3
            return -1;			//3
        }
    }
  1. 实现获取栈中元素个数的函数,显然元素个数为top。请你在topval函数下面写下一个返回值为 int 类型,没有参数,名称为 size 的函数,函数体中使用一句话返回 top 的值。

        int size(){					//4
           return top; 				//4
        }
    
  2. 我们的栈已经写好了,代码已经定义一个Stack类型的变量,依次把 1 到 10 这十个整数压入栈中,输出栈中元素的数量后,又依次输出栈顶元素并将其弹出。

  3. 点击运行,你会发现输出和输入是反着的,这也是栈的先进后出的性质体现。