[数据结构]栈

对于栈的部分总结。

概念

栈是一种操作受限的线性表。其主要特点是后进先出,即LIFO。只允许在线性表的一端进行插入删除。该端被称为栈顶,相对应的另一端被称作栈底。栈是线性表,即是一种逻辑结构,通常可分为顺序存储的顺序栈和链式存储的链栈。

顺序栈

使用一整块连续的空间用于存储栈中元素。此时需指明栈顶位置。

#define Maxsize 50
typedef struct Stack{
	ElemType data[Maxsize];
	int top;
}Stack;

部分基本操作

初始化 InitStack(S);
入栈 push(S,q);
出栈 pop(S,q);
判断是否为空 StackEmpty(S); //空则返回true
取栈顶元素(未出栈) GetTop(S,q);

链栈

可理解为不带头结点的单链表,每次入栈相当于使用头插法插入结点,出栈相当于删去首结点。

typedef struct Stack{
	ElemType data;
	struct Stack *next;
}Stack;

栈的应用

括号匹配
函数调用
表达式求值

括号匹配

#define Maxsize 1000
bool BracketsCheck(char data[],int n){
	char Stack[Maxsize];
	int top=-1;
	for(int i=0;i<n;i++){
		switch(data[i]){
			case '[':
				Stack[++top]=data[i];
				break;
			case '(':
			    	Stack[++top]=data[i];
   				break;
   			case{:
   				Stack[++top]=data[i];
				break;
			case ')':
				if(Stack[--top]!='(')
					return false;
			case ']':
				if(Stack[--top]!='[')
					return false;
			case '}':
				if(Stack[--top]!='{')
					return false;
		}
	}
	if(top!=-1)
		return false;
	return true;
}

表达式求值

中缀表达式:A+B*(C-D)-E/F
后缀表达式:ABCD-*+EF/-
思路:遇数字则输出,遇运算符时,若优先级>栈顶运算符则入栈;否则输出。

ABCD
+(-)
出栈,则有ABCD-
+
-,出栈
ABCD-+EF
-/
ABCD-
+EF/-

函数调用

如递归函数改写为非递归函数。

实现递归函数fn(x)=2xfn-1(x)+2(n-1)fn-2(x)
f0(X)=1,f1(x)=2x;

思路:从n=2开始逐个计算

double f(double x,int n){
	double fv1=2*x,fv2=1;
	double answer=0;
	int i=2;
	while(i<=n){
		answer=2*x*fv1+2*(i-1)*fv2;
		fv1=answer;
		fv2=fv1;
	}
	return answer;
}

递归函数转换为非递归函数通常需要栈的帮助,但并不是绝对。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值