栈和队列的基本实现和应用(数据结构复习)

冷不防 2022-10-19 04:13 254阅读 0赞

栈的基本实现

  1. 创建
  2. 入栈
  3. 出栈(查找)
  4. 删除

栈的应用

  1. 函数调用及递归实现
  2. 深度优先搜索
  3. 回溯算法
  4. 表达式求值

引言:斐波那契数列的实现

代码:斐波那契数列的递归法和迭代法

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lheWFfMTIzNDU2Nzg_size_16_color_FFFFFF_t_70

题一 :是否为合法序列

假设以I和O分别表示入栈和出栈操作。栈的初态和终态均为空,入栈和出栈的操作序

列可表示为仅由I和O组成的序列,可以操作的序列称为合法序列,否则称为非法序列。

1)如 IIIOOIOO是合法的

2) 如 IOOIOIIO是非法的,IIIOOIOI同样是非法的

写出一个算法,判定所给的操作序列是否合法。若合法,返回true,否则返回false(假定被判定的操作序列已存入一维数组中)

代码:

  1. int Judge(char A[])
  2. {
  3. int i=0;
  4. int sum=0;
  5. while(A[i]!='\0')
  6. {
  7. switch(A[i])
  8. {
  9. case 'I':
  10. sum++;
  11. break; //用+1表示进栈,用负1表示出栈
  12. case 'O':
  13. sum--;
  14. if(sum<0)
  15. {
  16. printf("序列非法\n");
  17. exit(0);
  18. }
  19. }
  20. i++;
  21. }
  22. if(sum!=0)
  23. {
  24. printf("序列非法\n");
  25. return false;
  26. }
  27. else
  28. {
  29. printf("序列合法\n");
  30. return true;
  31. }
  32. }

题二:判断链表的数据是否中心对称

设单链表的表头指针为L,结点结构由data和next两个域构成,其中data域为字

符型。试设计算法判断该链表的全部n个字符是否中心对称。例如xyx、XYYX都是中

心对称。

答:

算法思想:

  1. 使用栈来判断链表中的数据是否中心对称。让链表的前一半元素依次进栈。在处
  2. 理链表的后一半元素时,当访问到链表的一个元素后,就从栈中弹出一个元素,两个元素比较,
  3. 若相等,则将链表中的下一个元素与栈中再弹出的元素比较,直至链表到尾。这时若栈是空栈,
  4. 则得出链表中心对称的结论;否则,当链表中的一个元素与栈中弹出元素不等时,结论为链表非
  5. 中心对称,结束算法的执行。

代码

  1. int Judge(LinkList L,int n)
  2. {
  3. int i;
  4. char s[n/2];
  5. LinkList p=L->next;
  6. for(i=0; i<n/2; i++)
  7. {
  8. s[i]=p->data;
  9. p=p->next;
  10. }
  11. i--;
  12. if(n%2==1)
  13. p=p->next;
  14. while(!p)
  15. {
  16. if(s[i]!=p->data)
  17. {
  18. break;
  19. }
  20. i--;
  21. p=p->next;
  22. }
  23. if(i==-1)
  24. return 1;
  25. else
  26. return 0;
  27. }
  28. /*
  29. while(!p&&s[i]==p->data)
  30. {
  31. i--;
  32. p=p->next;
  33. }
  34. */

题三:共享栈的实现

设有两个栈sl、s2都采用顺序栈方式,并共享一个存储区[O,…,maxsize-l],为了尽量利用空间,减少溢出的可能,可采用栈顶相向、迎面增长的存储方式。 试设计s1、s2有关入栈和出栈的操作算法。

代码

  1. typedef struct ShareStack
  2. {
  3. Elementype stack[MaxSize];
  4. int top[2];
  5. } *Stack;
  6. //int push(int i,Elementype X);
  7. //int pop(int i);
  8. stack s;
  9. int push(int i,Elementype X)
  10. {
  11. if(i<0||i>1)
  12. {
  13. printf("栈号错误");
  14. exit(0);
  15. }
  16. if(s->top[1]+1==s->top[0])
  17. {
  18. printf("栈已经满\n");
  19. return 0;
  20. }
  21. switch(i)
  22. {
  23. case 0:s->stack[++s.top[0]]=X; break;
  24. case 1:s->stack[--s.top[1]=X;
  25. }
  26. return 1;
  27. }
  28. int pop(int i)
  29. {
  30. if(i<0||i>1)
  31. {
  32. printf("栈号错误");
  33. exit(0);
  34. }
  35. if(s->top[0]==-1&&s->top[1]==MaxSize)
  36. {
  37. printf("栈空\n");
  38. return 0;
  39. }
  40. switch(i)
  41. {
  42. case 0:s->stack[s.top[0]--]; break;
  43. case 1:s->stack[s.top[1]++];
  44. }
  45. return 1;
  46. }

附注:

switch(c)语句中c可以是int、long、char、unsigned int等类型, 唯独不可以是float类型

队列

题一:

发表评论

表情:
评论列表 (有 0 条评论,254人围观)

还没有评论,来说两句吧...

相关阅读

    相关 实际应用

    1.将一个非负的十进制整数N转换成其他D进制数。 解决思路,连续取模%和整除/。D进制各数位的产生顺序是从低位到高位,而输出顺序却是从高位到低位,刚好相反,可以考虑使用栈进行