C++顺序栈

目录

基础知识

栈的基本操作

C++参数传递方式(补充知识):

代码实现:栈的初始化、入栈(push)、出栈(pop)、是否为空(isEmpty)等 

常见应用与面试题

1.实现浏览器的前进后退功能

2.检查表括号是否平衡

3.表达式求值

4.使用堆栈计算后缀表达式

5.对堆栈中的值进行排序

6.函数调用栈


基础知识

栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。就像一摞叠放在一起的盘子,放盘子时从下往上一个个放,取盘子时从上往下一个个取,不能从中间抽出。后进者先出,先进者后出,这就是典型的“栈”结构。

从功能上来说,数组或者链表可以替代栈,但是特定的数据结构是对特定场景的抽象,而且数组或链表暴露了太多的操作接口,操作上自由灵活但是使用时比较不可控,自然就更容易出错。

当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出出,先进后出的特性,这是我们就应首选“栈”这种数据结构。

顺序栈:用数组实现的栈。

链式栈:用链表实现的栈。

栈的基本操作

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;
}

常见应用与面试题

1.实现浏览器的前进后退功能

2.检查表括号是否平衡

3.表达式求值

4.使用堆栈计算后缀表达式

5.对堆栈中的值进行排序

6.函数调用栈

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值