当前位置:   article > 正文

《大话数据结构》栈——仅限定在表尾进行插入和删除操作的线性表。_栈限定仅在表尾

栈限定仅在表尾

1.定义解读

栈是一个线性表,具有前后驱关系。

在线性表的表尾进行插入和删除操作,这里的表尾指的是栈顶。

2.栈的顺序表结构

  1. #define MAXSIZE 1000
  2. tyoedef struct
  3. {
  4. int data[MAXSIZE];
  5. int top;//栈顶
  6. }stack;

注意:

1)进栈操作

  1. /*插入元素e为新的栈顶元素 */
  2. #define MAXMIZE 100
  3. typedef struct
  4. {
  5. int data[MAXMIZE];
  6. int top;
  7. }stack;
  8. int push(stack *s,int e)
  9. {
  10. s->top++;
  11. s->data[s->top]=e;
  12. if(s->top==MAXSIZE-1)
  13. return 0;
  14. return 1;
  15. }

2)出栈操作

  1. /*若栈不空,则删除 S的栈顶元素,用 e 返回其值,并返回 OK , 否则返回 BRROR */
  2. #define MAXMIZE 100
  3. typedef struct
  4. {
  5. int data[MAXMIZE];
  6. int top;
  7. }stack;
  8. int pop(stack *s,int *e)
  9. {
  10. *e=s->data[s->top];
  11. s->top--;
  12. if(s->top==-1)
  13. return 0;
  14. return 1;
  15. }

上述的两个均为涉及到任何循环语句,因此时间复杂度是O(1)

 

3.两栈共享空间

前提是:两个具有相同数据类型的栈

对于一个数组而言,他有两个端点,就可以当作是两个栈底,让其中一个栈底为数组的始端,即下标为0处,让另一个栈为栈的末端,即下标为数组长度的n-1处。

形成的操作是:当两个栈增加元素,就会向中间延申

 

如何判断栈满?

  1. //栈共享空间
  2. #define MAXSIZE 100
  3. typedef struct
  4. {
  5. int data[MAXSIZE];
  6. int top1;//栈顶指针
  7. int top2;//栈底指针
  8. }dulstack;
  9. //两栈共享空间的push方法,除了要有插入元素的参数外,还需要判断是哪个栈stacknum
  10. int push(dulstack *s,int e,int stacknum)
  11. {
  12. //这个要首先判断是否栈满,就不用担心溢出的问题了
  13. if(s->top1+1==s->top2)
  14. return 0;
  15. //1有元素进栈
  16. if(stacknum==1)
  17. s->top1++;
  18. s->data[s->top1]=e;
  19. //s->data[++s->top1]=e;
  20. //2有元素进栈
  21. else if(stacknum==2)
  22. s->top2--;
  23. s->data[s->top2]=e;
  24. //s->data[--s->top2]=e;
  25. return 1;
  26. }
  27. /*若栈不空,则删除S的栈顶元素,用e返回其值,并返回1,否则返回0*/
  28. int pop(dulstack *s,int *e,int stacknum)
  29. {
  30. if(stacknum==1)
  31. {
  32. //1是空栈
  33. if(s->top1==-1)
  34. return 0;
  35. s->top1--;
  36. *e=s->data[s->top1];
  37. }
  38. else if(stacknum==2)
  39. {
  40. //2是空栈
  41. if(s->top2==-1)
  42. return 0;
  43. s->top2++;
  44. *e=s->data[s->top2];
  45. }
  46. return 1
  47. }

4.栈的链式存储结构

栈顶放在单链表的头部,对于栈链来说,是不需要头节点的。

对于空栈来说,链表的头指针是指向为空,那么栈链的空,其实就是top=NULL

  1. //链栈的结构
  2. typedef struct node
  3. {
  4. int data;
  5. struct node *next;
  6. }node,*nodeptr;
  7. typedef struct stack
  8. {
  9. nodeptr top;
  10. int count;
  11. }stack;

1)进栈操作

插入数据域为e的新节点s,top为栈顶指针

  1. tpyedef struct node
  2. {
  3. int data;
  4. struct node *next;
  5. }node,*nodeptr;
  6. typedef struct stack
  7. {
  8. nodeptr top;
  9. int count;
  10. }stack;
  11. /*插入元素 e 为新的栈顶元素*/
  12. int push(stack *s,int e)
  13. {
  14. nodeptr L=(nodeptr)malloc(sizeof(node));//开启了一个新node
  15. L->data=e;
  16. L->next=s->top;
  17. s->top=L;//新节点L赋值给栈顶指针
  18. s->count++;
  19. return 1;
  20. }

2)出栈

将p用来作为存储要删除的栈顶节点,将栈顶指针下移一位,最后释放p

  1. typedef struct node
  2. {
  3. int data;
  4. struct node *next;
  5. }node,*nodeptr
  6. typedef struct stack
  7. {
  8. nodeptr top;
  9. int count;
  10. }stack;
  11. /* 若栈不空,则删除s的栈顶元素,并用e返回其值,并返回1,否则返回0*/
  12. int pop(stack *s,int *e)
  13. {
  14. nodeptr p;//定义了一个新节点
  15. *e=s->top->data;
  16. p=s->top;//将栈顶节点的值赋值给怕,(3
  17. s->top=s->top->next;//将栈顶指针下移一位的关键操作
  18. free(p);
  19. s->count--;
  20. if(S->next==NULL)
  21. return 0;
  22. return 1;
  23. }

 

顺序栈链栈什么时候用?

 

栈的作用:

 

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/638010
推荐阅读
相关标签
  

闽ICP备14008679号