数据结构:栈——基础功能实现(C++实现)

这里是闲话:计算机小白第一次尝试发布自己的文章,思考后觉得从栈这个数据结构开始最合适了。以下是栈最简单的功能实现,包括栈的初始化、判断栈满栈空、压栈弹栈等功能,仅供参考噢~

一、 栈的结构体:

    这里实现的栈为最基础的顺序栈,用数组来存储栈的元素,并定义栈顶top和栈底base

typedef struct {
	SElemType elem[STACK_INIT_SIZE];
	int top, base;
}SqStack;

 

二、 栈数据结构的基本操作:

    1. 初始化栈:让栈顶下标top等于栈底下标base,使两者同时为零

Status InitStack(SqStack& s) {
	s.top = s.base = 0;
	return OK;
}

    2. 判断是否栈满:若栈顶下标top等于栈的存储空间数,则判断为栈满

bool StackFull(SqStack s) {
	return s.top == STACK_INIT_SIZE;
}

    3. 判断是否栈空:若栈顶等于栈底,则判断为栈空

bool StackEmpty(SqStack s) {
	return s.top == s.base;
}

    4. 压栈:首先判断栈是否满,若栈未满,将被插入元素赋值给top指向的元素,最后top加一。

Status Push(SqStack& s, SElemType e) {
	if (StackFull(s)) {
		cout << "栈满。" << endl;
		return ERROR;
	}
	s.elem[s.top++] = e;
	return OK;
}

    5. 弹栈:即删除栈顶元素,先存储栈顶元素,再将栈顶下标top减一。

//删除栈顶元素,并用e返回其值,复杂度为O(1)
Status Pop(SqStack& s, SElemType& e) {
	GetTop(s,e);
	s.top--;
	return OK;
}

    6. 返回栈长:top即为栈长。

//返回栈长,复杂度为O(1)
int StackLength(SqStack s) {
	return s.top;
}

    7. 返回栈顶元素的值:首先判断是否栈空,若栈非空,则存储top指向的元素,最后让top减一。

//用e返回栈顶元素的值,复杂度为O(1)
Status GetTop(SqStack s, SElemType& e) {
	if (StackEmpty(s)) {
		cout << "栈空。" << endl;
		return ERROR;
	}
	e = s.elem[s.top - 1];
	return OK;
}

    8. 置为空栈:将栈底下标base赋值给栈顶下标top。

//置为空栈,复杂度为O(1)
Status ClearStack(SqStack& s) {
	s.top = s.base;
	return OK;
}

    9. 重载输出栈:首先判断栈是否非空,若栈非空,依次输出栈中每个元素。

//重载输出栈,复杂度为0(n)
ostream& operator<<(ostream& out, SqStack s) {
	if (StackEmpty(s)) {
		out << "栈空。" << endl;
		return out;
	}
	out << "(";
	for (int i = 0; i < s.top; i++)
		out << s.elem[i] << ",";
	out << "\b)";
	return out;
}

    10. 运行结果及检验:

①检验问题:检验的基本操作如下

  1. 将6,5,4,3,2,1先后入栈,输出栈;
  2. 弹栈;
  3. 返回栈顶元素;
  4. 获取栈长;
  5. 清空栈;

②理论结果:

  1. S1 : (6, 5, 4, 3, 2, 1);
  2. 删除后S1 : (6, 5, 4, 3, 2), 删除元素为: 1;
  3. 栈顶元素为: 2;
  4. S1栈长为: 5;
  5. 栈空。

③实际结果:

    经检验,实验结果符合理论。


关于栈的基本操作就到此结束啦!下一篇文章是栈的应用,包括数值转换、括号匹配、行编辑程序、迷宫求解、表达式求值,有兴趣的小伙伴可以继续浏览噢~

这里是链接:https://blog.csdn.net/jokerCe/article/details/114141469

猜你喜欢

转载自blog.csdn.net/jokerCe/article/details/114139123