目录
代码实现:栈的初始化、入栈(push)、出栈(pop)、是否为空(isEmpty)等
基础知识
栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。就像一摞叠放在一起的盘子,放盘子时从下往上一个个放,取盘子时从上往下一个个取,不能从中间抽出。后进者先出,先进者后出,这就是典型的“栈”结构。
从功能上来说,数组或者链表可以替代栈,但是特定的数据结构是对特定场景的抽象,而且数组或链表暴露了太多的操作接口,操作上自由灵活但是使用时比较不可控,自然就更容易出错。
当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出出,先进后出的特性,这是我们就应首选“栈”这种数据结构。
顺序栈:用数组实现的栈。
链式栈:用链表实现的栈。
栈的基本操作
C++参数传递方式(补充知识):
- 按值传递:调用函数本身不对实参进行操作,也就是说,即使形参的值在函数中发生了变化,实参的值也完全不会受到影响,仍为调用前的值。
- 指针传递:地址传递与按值传递的不同在于,它把实参的存储地址传送给对应的形参,从而使得形参指针和实参指针指向同一个地址。因此,被调用函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。
- 引用传递:如果以引用为参数,则既可以使得对形参的任何操作都能改变相应的数据,又使得函数调用显得方便、自然。引用传递方式是在函数定义时在形参前面加上引用运算符“&”。
代码实现:栈的初始化、入栈(push)、出栈(pop)、是否为空(isEmpty)等
#include<iostream>
const int maxsize = 100;
using namespace std;
typedef int sElemType;
//顺序栈的储存结构
struct sqStack {
sElemType* base;
sElemType* top;
int stackSize;
};
//初始化
void initStack(sqStack& s)
{
s.base = new sElemType[maxsize];
s.top = s.base;
s.stackSize = maxsize;
}
//判断栈是否为空,若为空返回true,若非空返回false
bool isEmpty(sqStack& s)
{
if (s.top = s.base)
return true;
return false;
}
//入栈,插入元素e为新的栈顶元素
void push(sqStack& s, sElemType e)
{
if (s.top - s.base == s.stackSize)
cout << "Failed! The stack is full!\n";
*s.top = e;
s.top++;
}
//出栈,若栈不空则删除栈顶元素,用e返回其值
void pop(sqStack& s, sElemType& e)
{
if (s.top == s.base)
cout << "Failed! The stack is empty!\n";
e = *(--s.top);
}
//读取栈顶元素
sElemType getTop(sqStack s)
{
if (s.top == s.base)
cout << "Failed! The stack is empty!\n";
return *(s.top - 1);
}
//计算栈中元素个数
int count(sqStack s)
{
if (s.top == s.base)
cout << "Failed! The stack is empty!\n";
return s.top - s.base;
}
//打印栈
void printStack(sqStack s)
{
if (s.top == s.base)
cout << "Failed! The stack is empty!\n";
sElemType* p = s.base;
while (p != s.top)
{
cout <<" " << *p;
p++;
}
cout << endl;
}
int main()
{
sqStack s;
int e;
initStack(s);
cout << "Enter the element(Enter -1 to end): ";
cin >> e;
while (e != -1)
{
push(s, e);
cout << "Enter the element(Enter -1 to end): ";
cin >> e;
}
cout << "打印栈:";
printStack(s);
cout << "出栈,打印栈: ";
pop(s, e);
printStack(s);
e = getTop(s);
cout << "读取栈顶元素,栈顶元素=" << e << ",打印栈:";
printStack(s);
cout << "栈中元素个数=" << count(s) << endl;
return 0;
}