数据结构 栈

来源:互联网 发布: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
原创粉丝点击