数据结构 栈
来源:互联网 发布:nginx 指定目录 编辑:程序博客网 时间:2024/06/05 19:38
1.栈stack:是限定仅在表尾进行删除和插入操作的线性表。允许插入删除的一端叫做栈顶top,另外一端叫做栈底bottom。栈又称为后进先出(LIFO)的线性表。即表尾是指栈顶。
2.顺序栈:
定义:top指向可存入元素的位置。
typedef struct StackType{ElemType data[MAXSIZE];int top;}StackType;
插入:进栈的顺序是在top指向的可存入空间中压入数据,然后top++。
Status PushStack(StackType* stack,ElemType x){ if((stack->top)>=MAXSIZE) return ERROR; stack->data[stack->top++]=x; return OK;}
删除:出栈的顺序是找到最后一个数据--top,然后修改x指向的值。
Status PopStack(StackType* stack,ElemType *x){if(stack->top==0) return 0;*x = stack->data[--(stack->top)];return OK;}
3.两栈共享空间:就是构造一个数组来存储两个栈,通常是两个栈的空间需求有相反关系时使用。一个的栈底在data[0],一个栈的栈底在data[MAXSIZE-1]。这时,满栈的判断就是top1==top2。
4.栈的链式存储:链栈的栈顶在表头,就不再需要头结点了。
typedef struct ListStack{ Node * top; int length;}ListStack;
进栈:top指向当前的栈顶元素。
Status Push(ListStack *S, ElemType x){ Node *p = (Node *)malloc(sizeof(Node)); p->data = x; p->next = S->top; //新的节点后继指向栈顶 S->top = p;//top指向新的节点 S->length++; return OK;}
出栈:返回的是那个删掉的节点,后续不用还要释放掉节点。
Node* Pop(ListStack *S){ Node* out = S->top; if(S->top!=NULL)//若不是空栈 { S->top = S->top->next; S->length--; } return out;}
5.顺序栈和链栈的对比:时间复杂度均为O(1)。顺序栈要事先确定一个固定的长度,可能存在内存浪费。链栈要求每个元素有指针域,同时也增加了一些内存开销,但对于栈的长度无限制。
6.递归:函数的调用的过程是入栈出栈的过程。首先,把函数的形参从右到左压入栈中,最后把函数名压入。执行函数时,先取出函数名,再取出形参。当还没有执行完毕时,进入递归,向栈里压入了另一个函数名,最后取出时就会退回到后压入栈的函数名。
7.迭代和递归的区别:迭代使用循环结构,递归使用选择结构。递归会建立函数的副本,耗费时间和内存。迭代不需要额外的内存。递归可以使程序结构更清晰简洁,让人理解。
8.后缀表达式:栈的应用
中缀表达式变成后缀表达式:符号入栈。后缀表达式计算出结果:数据入栈。
0 0
- 数据结构---栈
- 数据结构-栈
- 数据结构 栈
- 数据结构--栈
- 数据结构 栈
- 数据结构(栈)
- 数据结构栈
- 数据结构-栈
- 数据结构-----栈
- 数据结构-栈
- 【数据结构】栈
- 数据结构---->栈
- 数据结构---栈
- 数据结构--栈
- 数据结构----栈
- 数据结构--栈
- 【数据结构】 栈
- 数据结构 -- 栈
- 【LeetCode】Word Search
- 如何用cmd关闭打开的程序
- 数据结构-----约瑟夫环问题
- 虚拟机内存不够时,导致的机器启不来解决方法
- ubuntu上安装lamp服务
- 数据结构 栈
- linux常用命令
- 大型网站技术架构(七)--网站的可扩展性架构
- strcpy、strcmp原型实现
- Linux常用压缩解压命令
- 函数调用的代价
- Windows 常用DOS命令
- MIME 类型
- android launchMode 加载模式 个人理解