文章目录

  • 1、存储结构 P46
  • 2、顺序栈实现
  • 3、链栈的实现
  • 4、进制转换
  • 5、括号匹配
  • 6、行编辑程序
  • 7、迷宫求解
  • 8、表达式求值
  • 9、斐波那契数列
  • 10、汉诺塔问题

1、存储结构 P46

typedef struct{int *base;int *top;int StackSize;
}SqStack;

2、顺序栈实现

会了顺序表和链表的话,栈就简单的多了
下面我给出的这个小例子,里面包含了顺序栈的初始化、压栈、弹栈、遍历操作

#include<stdio.h>
#include<malloc.h>#define Init_size 100
#define Increment 10typedef struct{int *base;int *top;int StackSize;
}SqStack;int InitStack(SqStack *S){//初始化S->base=(int *)malloc(Init_size*sizeof(int));if(!S->base) return -1;S->top=S->base;S->StackSize=Init_size;return 0;
}
int Push(SqStack *S,int e){//入栈if(S->top-S->base>=S->StackSize){//如果空间不够 增加空间S->base=(int *)realloc(S->base,(S->StackSize+Increment)*sizeof(int));if(!S->base) return -1;S->top=S->base+S->StackSize;S->StackSize+=Increment;}*(S->top)=e;S->top++;return 0;
}
int Pop(SqStack *S,int *e){//弹栈if(S->top==S->base)return -1;S->top--;*e=*(S->top);return 0;
}
int main(){//申请一个栈 将1-10依次入栈 并依次弹栈输出SqStack S;InitStack(&S);for(int i=1;i<=10;i++){Push(&S,i);}int e;while(S.base!=S.top){Pop(&S,&e);printf("%d ",e);}
}

3、链栈的实现

关于链栈的实现,其实前面我们在写链表的时候,最终我们优化出来的终极版本,其实就已经很像一个链式栈了。只是操作上再加以限制就好了
栈要遵循先进后出的原则:


需要注意的是,我们在弹栈的时候,也就相当于删除链表末尾元素,所以要先找到末尾元素的前驱,如果这是个双向链栈,那么我们可以直接通过top指针找到他的前驱,单向链栈的话,我们就需要遍历找到最后了。
这里我用的是单向链栈,显然用双向效率更高,有兴趣可以试试实现双向链栈。
实现代码:


#include<stdio.h>
#include<malloc.h>typedef struct LDataNode{int x;struct LDataNode *next;//结点指针
}LDataNode;
typedef struct LHeadNode{LDataNode *base; //栈底指针LDataNode *top; //栈顶指针
}LHeadNode,*LinkStack;int InitStack(LinkStack *head){//初始化链栈*head =(LinkStack)malloc(sizeof(LHeadNode));//指向头结点的头指针LDataNode *vhNode =(LDataNode *)malloc(sizeof(LDataNode));//首元结点if(*head==NULL||vhNode==NULL) return -1;//申请失败vhNode->next=NULL;(*head)->base=vhNode;(*head)->top=vhNode;return 0;
}
int Push(LinkStack *head,int e){(*head)->top->x=e;//压入栈LDataNode *vhNode =(LDataNode *)malloc(sizeof(LDataNode));if(vhNode==NULL)  return -1;//申请失败(*head)->top->next=vhNode;vhNode->next=NULL;(*head)->top=vhNode;//栈顶指针后移return 0;
}
int Pop(LinkStack *head,int *e){LDataNode *p=(*head)->base;//指向第1个结点while(p!=NULL){//遍历链栈if(p->next==(*head)->top) break;p=p->next;}(*head)->top=p;//栈顶指针回退*e=p->x;return 0;
}
int main(){LinkStack head;InitStack(&head);for(int i=1;i<=10;i++){Push(&head,i);//依次压栈}int e;for(int i=1;i<=10;i++){Pop(&head,&e);//依次弹栈printf("%d ",e);}
}

4、进制转换

注意:这里我写的三个程序,均实现的是一个十进制数转化成n进制数,n<10.
如果要转换十六进制,需要略作修改。

C语言实现

#include<stdio.h>
#include<malloc.h>#define Init_size 100
#define Increment 10typedef struct{int *base;int *top;int StackSize;
}SqStack;int InitStack(SqStack *S){//初始化S->base=(int *)malloc(Init_size*sizeof(int));if(!S->base) return -1;S->top=S->base;S->StackSize=Init_size;return 0;
}
int Push(SqStack *S,int e){//入栈if(S->top-S->base>=S->StackSize){//如果空间不够 增加空间S->base=(int *)realloc(S->base,(S->StackSize+Increment)*sizeof(int));if(!S->base) return -1;S->top=S->base+S->StackSize;S->StackSize+=Increment;}*(S->top)=e;S->top++;return 0;
}
int Pop(SqStack *S,int *e){//弹栈if(S->top==S->base)return -1;S->top--;*e=*(S->top);return 0;
}
//将10进制数a转换为n进制数
int conversion(int a,int n){SqStack S;InitStack(&S);while(a){Push(&S,a%n);a/=n;}int e;while(S.top!=S.base){Pop(&S,&e);printf("%d",e);}return 0;
}
int main(){int a,n;scanf("%d%d",&a,&n);conversion(a,n);
}

数组模拟栈实现:

#include<stdio.h>
int conversion(int a,int n){int q[100];//模拟栈int t=0,w=0;//模拟指针while(a){q[w++]=a%n;a/=n;}while(w){printf("%d",q[--w]);}
}
int main(){int a,n;scanf("%d%d",&a,&n);conversion(a,n);
}

C++(STL)实现

/******
author:  1900
language: C++
******/
#include<iostream>
#include<algorithm>#include<stack>using namespace std;
int conversion(int a,int n){stack<int> q;while(a){q.push(a%n);a=a/n;}while(!q.empty()){cout<<q.top();q.pop();}return 0;
}
int main(){int a;cin>>a;conversion(a,8);
}

5、括号匹配

注意:括号是字符型数据

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define Init_size 100
#define Increment 10typedef struct{int *base;int *top;int StackSize;
}SqStack;int InitStack(SqStack *S){//初始化S->base=(int *)malloc(Init_size*sizeof(char));if(!S->base) return -1;S->top=S->base;S->StackSize=Init_size;return 0;
}
int Push(SqStack *S,char e){//入栈if(S->top-S->base>=S->StackSize){//如果空间不够 增加空间S->base=(int *)realloc(S->base,(S->StackSize+Increment)*sizeof(int));if(!S->base) return -1;S->top=S->base+S->StackSize;S->StackSize+=Increment;}*(S->top)=e;S->top++;return 0;
}
int Pop(SqStack *S,char *e){//弹栈if(S->top==S->base)return -1;S->top--;*e=*(S->top);return 0;
}int main(){SqStack S;InitStack(&S);char a[100];scanf("%s",a);int l=strlen(a);char e;for(int i=0;i<l;i++){if(a[i]=='('||a[i]=='['||a[i]=='{'){Push(&S,a[i]);}else{if(a[i]==')'&&*(S.top-1)=='('){Pop(&S,&e);}else if(a[i]==']'&&*(S.top-1)=='['){Pop(&S,&e);}else if(a[i]=='}'&&*(S.top-1)=='{'){Pop(&S,&e);}}}if(S.top==S.base) printf("Yes\n");else printf("No\n");
}

6、行编辑程序

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define Init_size 100
#define Increment 10typedef struct{int *base;int *top;int StackSize;
}SqStack;int InitStack(SqStack *S){//初始化S->base=(int *)malloc(Init_size*sizeof(char));if(!S->base) return -1;S->top=S->base;S->StackSize=Init_size;return 0;
}
int Push(SqStack *S,char e){//入栈if(S->top-S->base>=S->StackSize){//如果空间不够 增加空间S->base=(int *)realloc(S->base,(S->StackSize+Increment)*sizeof(int));if(!S->base) return -1;S->top=S->base+S->StackSize;S->StackSize+=Increment;}*(S->top)=e;S->top++;return 0;
}
int Pop(SqStack *S,char *e){//弹栈if(S->top==S->base)return -1;S->top--;*e=*(S->top);return 0;
}
int LTraverse(SqStack S){while(S.base!=S.top){printf("%c",*(S.base));S.base++;}printf("\n");
}
int main(){char a[100];while(scanf("%s",a)!=EOF){SqStack S;InitStack(&S);int l=strlen(a);char e;for(int i=0;i<l;i++){if(a[i]=='#'){Pop(&S,&e);}else if(a[i]=='@'){S.top=S.base;//清空栈}else{Push(&S,a[i]);}}LTraverse(S);//正序遍历整个栈}
}

7、迷宫求解

关于这个迷宫求解,建议后边学了图之后,再回过头来写,会更明白些
这里贴出一个我之前学的时候写的
两种写法:
迷宫求解解法详解

8、表达式求值

关于最后这三个问题,我先更新下边的东西,这个回过头第二遍的时候再写吧,我太懒了,要跟不上进度了。。。/大哭

9、斐波那契数列

10、汉诺塔问题

章节3.1和3.2----栈的表示、实现和应用相关推荐

  1. 栈(Stack)和队列(Queue)详解

    1. 什么是栈,栈存储结构详解 同顺序表和链表一样,栈也是用来存储逻辑关系为 "一对一" 数据的线性存储结构,如图 1 所示. 图 1 栈存储结构示意图 从图 1 我们看到,栈存储 ...

  2. C语言数据结构【手抄版】第三章 栈和队列

    注意:文中彩色代码均在Visual Studio 2022编译器中编写,本文为C语言数据结构手抄版,文中有部分改动,非原创. 目录 注意:文中彩色代码均在Visual Studio 2022编译器中编 ...

  3. 2015计算机考研重点,2015考研计算机复习:数据结构重点归纳_跨考网

    计算机专业数据结构复习重点归纳(适于清华严版教材) 一.数据结构的章节结构及重点构成 数据结构学科的章节划分基本上为:概论,线性表,栈和队列,串,多维数组和广义表,树和二叉树,图,查找,内排,外排,文 ...

  4. 数据结构知识点总结整理

    数据结构知识点总结整理 0.常考基础必知必会 A. 排序:排序有几种,各种排序的比较,哪些排序是稳定的,快排的算法: B. 查找:哈希查找.二叉树查找.折半查找的对比,哈希映射和哈希表的区别? C. ...

  5. 程序员笔试笔记c++

    0.常考基础必知必会 A. 排序:排序有几种,各种排序的比较,哪些排序是稳定的,快排的算法: B. 查找:哈希查找.二叉树查找.折半查找的对比,哈希映射和哈希表的区别? C. 链表和数组的区别,在什么 ...

  6. 跟我一起玩《linux内核设计的艺术》第1章(四)——from setup.s to head.s,这回一定让main滚出来!(已解封)

    看到书上1.3的大标题,以为马上就要见着main了,其实啊,还早着呢,光看setup.s和head.s的代码量就知道,跟bootsect.s没有可比性,真多--这确实需要包括我在内的大家多一些耐心,相 ...

  7. 考研计算机统考知识点,09计算机考研统考大纲权威解读之考试范围

    09年计算机考研统考大纲权威解读之考试范围分析 下面我们来说说新大纲的考查范围,统考大纲的考查范围说的比较笼统,考查的知识点方面也只是把有关教材的章节名列举出来,并没有强调每个知识点应该掌握到什么程度 ...

  8. 程序员笔试知识点整理

    程序员笔试知识点整理 0.常考基础必知必会 A. 排序:排序有几种,各种排序的比较,哪些排序是稳定的,快排的算法: B. 查找:哈希查找.二叉树查找.折半查找的对比,哈希映射和哈希表的区别? C. 链 ...

  9. 啊哈!算法 案例用c++实现

    第二章 我觉得此章节的数据结构可以实现一下 栈 数组实现栈 #include<iostream>using namespace std;struct stack {int top;//下一 ...

  10. 计算机考研专业课复习资料,考研计算机专业课复习重点归纳

    考研计算机专业课复习重点归纳中国大学网考研:一.数据结构的章节结构及重点构成 数据结构学科的章节划分基本上为:概论,线性表,栈和队列,串,多维数组和广义表,树和二叉树,图,查找,内排,外排,文件,动态 ...

最新文章

  1. 笔记-项目风险管理-转-从木桶效应谈对于安全管理的认识
  2. modbus软件开发实战指南_C++核心准则?GSL:指南支持库
  3. Java EE 8的前5个新功能
  4. 界面优美的linux,Ubuntu 11.04新版发布 诠释精美用户界面
  5. 关于如何破坏单例我说了好几种方式,面试官却说:我其实随便问问,没想到你真会...
  6. Linux内核参数(如kernel.shmmax)及Oracle相关参数调整(如SGA_MAX_SIZE)
  7. Oralce定时任务实际应用
  8. python 遗传算法精简版
  9. java中的“+”运算符,产生新对象问题。(非常好的面试题!)
  10. kettle 连接 Oracle 异常
  11. Java代码执行Linux脚本
  12. Android Studio查看Android源码
  13. Mugeda(木疙瘩)H5案例课—什么,才是福-岑远科-专题视频课程
  14. 深度学习环境安装所需软件介绍cuda+cudnn+driver+anaconda+keras+tensorFlow+Pycharm+Jupyer(下载地址+配图)
  15. JavaScript中的call(),apply(),伪数组转化为数组
  16. 【第二剑-构建活动】代码应该怎么写?
  17. GLTF格式学习:glTF介绍( 基于WebGL
  18. 关于视频录制动态贴纸的问题
  19. C语言编程实现冰雹猜想的算法,并测算各个自然数到达4-2-1谷底(即N等于4,2,1结束后)所经过的变换次数。
  20. HCIP-H12-221单选题库(4)

热门文章

  1. Python面向对象成员修饰符
  2. android textview 设置单行最大宽度和ellipsize省略号时整体变短的问题
  3. NodeJs——子进程
  4. 如何学习angular.js
  5. Apache for windows虚拟主机配置方案(安全优化)
  6. linux DHCP多作用域
  7. 学习Unix下C编程的实例
  8. MySQL 主外键关系
  9. Git安装遇到的问题fatal: Could not read from remote repository.的解决办法
  10. Android listview实现单选变化的效果