栈的增删改查基本操作
来源:互联网 发布:东方有线网络 编辑:程序博客网 时间:2024/06/05 07:16
栈的增删改查基本操作
1.顺序栈
//顺序栈结构体定义#define STACKSIZE 64 //栈的大小typedef int stackType;typedef struct _snode{ stackType data[STACKSIZE]; //栈中的实际存储数据 int top; //栈顶指标,等价于数组下标。}SeqStack,*pSeqStack; //创建栈pSeqStack SeqStackCreat(){ pSeqStack node = (pSeqStack)malloc(sizeof(SeqStack)); if(NULL == node) { perror("malloc err"); return NULL; } memset((void*)(node->data), 0,STACKSIZE); node->top = -1; return node;}//判断栈是否满int SeqStackisFull(pSeqStack S){ if(S->top > STACKSIZE) return 1; else return 0;}//入栈int SeqStackPush(pSeqStack S,stackType data){ if(S->top > STACKSIZE) { printf("SeqStack is Full\n"); return -1; } S->top++; S->data[S->top] = data; return 0;}//出栈int SeqStackPop(pSeqStack S,stackType *data){ if(S->top < 0) { printf("SeqStack is Empty\n"); return -1; } *data = S->data[S->top]; S->top--; return 0;}//删除栈int SeqStackFree(pSeqStack S){ free(S); return 0;}int printSeqStack(pSeqStack S){ int i = 0; for(i = 0;i <= S->top;i++) { printf("%4d ",S->data[i]); } printf("\r\n"); return i;}
2.共享栈
两个栈共享一个数组,建立两个栈的栈底,一个位于数组的始端data[0],一个位于数组的末端data[N-1]如果两个栈增长,向数组中间延伸
typedef struct _sdnode{ stackType data[STACKSIZE]; //栈中的实际存储数据 int top1; //栈1栈顶指标,等价于数组下标 int top2; //栈2栈顶指标}SeqDStack,*pSeqDStack; //当 top1 + top2 = STACKSIZE;表示栈满//或者当 top1 + 1 = top2; 也表示栈满pSeqDStack SeqDStackCreat(){ pSeqDStack node = (pSeqDStack)malloc(sizeof(SeqDStack)); if(NULL == node) { perror("malloc err"); return NULL; } memset((void*)(node->data), 0,STACKSIZE); node->top1 = -1; node->top2 = STACKSIZE; return node;}//入栈int SeqDStackPush(pSeqDStack S,stackType data,int stackNum){ //if(S->top1 + S->top2 >= STACKSIZE) if(S->top1 + 1 > S->top2) { printf("SeqStack is Full\n"); return -1; } if(stackNum == 1) { S->top1++; S->data[S->top1] = data; } else { S->top2--; S->data[S->top2] = data; } return 0;}//出栈int SeqDStackPop(pSeqDStack S,stackType *data,int stackNum){ if(S->top1 + 1 > S->top2) { printf("SeqStack is Full\n"); return -1; } if(stackNum == 1) { if(S->top1 < 0) return -2; *data = S->data[S->top1--]; } else { if(S->top2 > STACKSIZE) return -2; *data = S->data[S->top2++]; } return 0;}int printSeqDStack(pSeqDStack S){ int i = 0; printf("Top1:\n"); for(i = 0;i <= S->top1;i++) { printf("%4d ",S->data[i]); } printf("\r\n"); printf("Top2:\n"); for(i = STACKSIZE - 1;i >= S->top2;i--) { printf("%4d ",S->data[i]); } printf("\r\n"); return i;}
3.链式栈
其数据结构还是同单链表,只是存取数据的方式变为类似栈的操作
//结构体typedef struct _slnode { dataType data; //用每个结点存储数据 struct _slnode *next; //指向下一个结点}StackNode,*pStackNode; typedef struct _stack{ pStackNode top; //指向栈顶 int count; //计数}LinkStack,*pLinkStack; //仅仅是封装这两个变量//创建结点pStackNode LinkStackCreatNode(dataType data){ pStackNode node = (pStackNode)malloc(sizeof(StackNode)); if(NULL == node) { perror("LinkStackCreatNode malloc"); return NULL; } node->data = data; node->next = NULL; return node;}//创建链式栈pLinkStack LinkStackCreatList(){ pLinkStack s = (pLinkStack)malloc(sizeof(LinkStack)); if(NULL == s) { perror("LinkStackCreatList malloc"); return NULL; } s->count = 0; s->top = NULL;}//入栈int LinkStackPush(pLinkStack S,dataType data){ pStackNode p = LinkStackCreatNode(data); if(NULL == p) { perror("LinkStackCreatNode"); return -1; } p->next = S->top; //新插入的结点 S->top = p; S->count++; return 0;}//出栈int LinkStackPop(pLinkStack S,dataType *data){ if(S->count < 1) return -1; pStackNode p = S->top; *data = p->data; S->top = p->next; S->count--; free(p);}int printLinkStack(pLinkStack S){ int i = 0; pStackNode p = S->top; for(i = 0;i < S->count;i++) { printf("%4d ",p->data); p = p->next; } printf("\r\n"); return i;}
测试main函数
int main(){ //顺序栈 pSeqStack s_Stack = NULL; int m_data = 0; s_Stack = SeqStackCreat(); for(int i = 0;i < 20;i++) { SeqStackPush(s_Stack,i + 60); } printSeqStack(s_Stack); for(int i = 0;i < 20;i++) { SeqStackPop(s_Stack,&m_data); printf("Pop:%d\r\n",m_data); } SeqStackFree(s_Stack); //共享栈 pSeqDStack s_dStack = SeqDStackCreat(); int m_data = 0; for(int i = 0;i < 20;i++) { SeqDStackPush(s_dStack,i + 60,1); SeqDStackPush(s_dStack,i + 60,2); } printSeqDStack(s_dStack); for(int i = 0;i < 20;i++) { SeqDStackPop(s_dStack,&m_data,1); printf("Pop1:%d\r\n",m_data); SeqDStackPop(s_dStack,&m_data,2); printf("Pop2:%d\r\n",m_data); } free(s_dStack); //链式栈 pLinkStack s_sLink = LinkStackCreatList(); int m_data = 0; for(int i = 0;i < 20;i++) LinkStackPush(s_sLink,i+80); printLinkStack(s_sLink); for(int i = 0;i < 20;i++) { LinkStackPop(s_sLink,&m_data); printf("Pop:%d\n",m_data); } return 0;}
阅读全文
0 0
- 栈的增删改查基本操作
- MyBatis的增删改查基本操作
- Ibatis基本的增删改查操作
- ldap的增删改查基本操作
- Mybatis 增删改查的基本操作
- mysql基本的增删改查操作
- mysql 基本的增删查改操作
- mysql操作的基本增删改查
- mongoDB-- 基本的操作增删改查
- 单链表的增删改查基本操作
- 双链表的增删改查基本操作
- 增删查改基本操作
- 基本操作增删改查
- Sql的基本操作之增删查改操作
- 基本的增删改查
- tp基本的增删改查的操作demo
- 链表的基本操作的实现---- 增删改查
- 数据库中表的增删改查的基本操作命令
- 2018走美杯与往年考点知识会有什么变化吗?
- 深度学习入门者的Python快速教程
- Mongodb 的索引架构
- iOS开发笔记之view的渲染优化
- 关于TP5视图分离到根目录的解决方法 原有: 为了方便前端开发,我想把视图(view)部分分离出来专门给前端进行修改 过程:在进行视图设置分离的过程遇到了问题 参考了官方文档http://www
- 栈的增删改查基本操作
- iOS中如何获取当前网络及其本地IP(Swift)
- IOS 键盘右上角完成按钮自定义
- spring 中事务配置方式以及事务的传播性、隔离级别
- 内存空间和用户空间
- 侧滑菜单+横向滑动列表
- zabbix3邮件告警
- 一图详解仿射变换的旋转矩阵推导
- AngularJS+日程表+显示、隐藏 +orderBy排序