博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
顺序栈与两栈共享空间-C语言实现
阅读量:5282 次
发布时间:2019-06-14

本文共 4703 字,大约阅读时间需要 15 分钟。

栈是一种只能允许在栈顶插入数据与删除数据的数据结构,其实这就是一种特殊的线性表,特殊在 只能在表尾进行增减元素,上代码

 

#include 
#define MAXSIZE 20 //栈空间大小typedef int SElemType; //元素类型typedef int Status; //返回值类型#define OK 1 //操作成功#define ERROR 0 //操作失败typedef struct //顺序栈的数据结构{ SElemType date[MAXSIZE]; //栈元素数据 int top; //栈顶指针}SeqStack; //栈名/*入栈操作*/Status Push(SeqStack *S, SElemType e){ if(S->top == MAXSIZE-1) //判断栈是否已满 return ERROR; S->date[++S->top] = e; //栈顶指针加1,栈顶元素等于e return OK;}/*出栈操作*/Status Pop(SeqStack *S, SElemType *e){ if(S->top == -1) //判断栈是否为空 return ERROR; *e = S->date[S->top--]; //将栈顶元素赋值与e,并将栈顶指针减1 return OK;}void main(){ SeqStack S; //创建栈S S.top = -1; //栈顶指针为-1,栈为空 int e; //入栈与出栈的元素 while(true) { printf("请选择对顺序栈的操作:\n"); printf("1.入栈\n"); printf("2.出栈\n"); printf("3.退出\n"); int a; scanf("%d", &a); switch(a) { case 1: printf("请输入入栈的元素:"); scanf("%d", &e); if(Push(&S, e)) printf("入栈成功\n"); else printf("入栈失败\n"); break; case 2: if(Pop(&S, &e)) printf("出栈的元素为:%d\n",e); else printf("栈空\n"); break; case 3: return; default: printf("选择错误\n"); break; } }}

 

顺序栈中有一类比较特殊的栈,就是两个数据类型一样的栈可以共享同一个数组空间,从而可以节约内存空间。

 

#include
#define MAXSIZE 100 //栈空间大小typedef int ElemType; //元素类型typedef int Status; //返回值类型#define OK 1 //操作成功#define ERROR 0 //操作失败typedef struct //共享栈结构体{ ElemType date[MAXSIZE]; //栈元素 int top1; //栈1栈顶指针 int top2; //栈2栈顶指针}SeqDoubleStack; //栈名/*双向栈的入栈操作*/Status Push(SeqDoubleStack *S, int flag, ElemType e){ if(S->top1 + 1 == S->top2) //判断栈是否已满 return ERROR; if(flag == 1) //若flag等于1,则对栈1操作 S->date[++S->top1] = e; //将栈1指针加1,并赋值为e if(flag == 2) //若为2,对栈2操作 S->date[--S->top2] = e; //将栈2指针减1,并赋值为e return OK;}/*双向栈的出栈操作*/Status Pop(SeqDoubleStack *S, int flag, ElemType *e){ if(flag == 1 && S->top1 != -1) //若flag为1且栈1栈顶不是-1 { *e = S->date[S->top1--]; //将栈顶元素赋值给e,并将栈顶减1 return OK; } if(flag == 2 && S->top2 != MAXSIZE) //若flag为2且栈2栈顶不是MAXSIZE { *e = S->date[S->top2++]; //将栈顶元素赋值给e,并将栈顶加1 return OK; } return ERROR;}void main(){ SeqDoubleStack S; //创建栈S S.top1 = -1; //栈顶1指针为-1,栈为空 S.top2 = MAXSIZE; //栈顶2指针为MAXSIZE,栈为空 int e; //入栈与出栈的元素 while(true) { printf("请选择对顺序栈的操作:\n"); printf("1.栈1入栈\n"); printf("2.栈2入栈\n"); printf("3.栈1出栈\n"); printf("4.栈2出栈\n"); printf("5.退出\n"); int a; scanf("%d", &a); switch(a) { case 1: printf("请输入入栈1的元素:"); scanf("%d", &e); if(Push(&S, 1, e)) printf("入栈成功\n"); else printf("入栈失败\n"); break; case 2: printf("请输入入栈2的元素:"); scanf("%d", &e); if(Push(&S, 2, e)) printf("入栈成功\n"); else printf("入栈失败\n"); break; case 3: if(Pop(&S, 1, &e)) printf("出栈的元素为:%d\n",e); else printf("栈空\n"); break; case 4: if(Pop(&S, 2, &e)) printf("出栈的元素为:%d\n",e); else printf("栈空\n"); break; case 5: return; default: printf("选择错误\n"); break; } }}

 

使用这种结构时,大多是这两个栈的空间需求有相反关系,使得在一个栈的元素个数增多时,另一个栈的元素个数会相对减少,比如股票的买卖可以使用这种结构,因为你买入的时候,就一定是有人卖出了;你挣钱的时候,就一定是有人赔钱了。如果这两个栈没有什么关系,那么对于内存的节省是不明显的,因为随时都有溢出的可能,那这就没有什么意义了。

 

转载于:https://www.cnblogs.com/yurui/p/9514401.html

你可能感兴趣的文章
k8s-存储卷1-十二
查看>>
在Android中Intent的概念及应用(二)——Intent过滤器相关选项
查看>>
第十六章 多态性(一)
查看>>
INSERT IGNORE INTO / REPLACE INTO
查看>>
Python数据类型-布尔/数字/字符串/列表/元组/字典/集合
查看>>
【刷题】SPOJ 705 SUBST1 - New Distinct Substrings
查看>>
IEEE 754浮点数表示标准
查看>>
declare 结构用来设定一段代码的执行指令
查看>>
图解算法读书笔记
查看>>
调试学习笔记
查看>>
解开lambda最强作用的神秘面纱
查看>>
Java基础:Object类中的equals与hashCode方法
查看>>
C#拦截Http请求
查看>>
图片下载器
查看>>
找不到docker.socket解决方法
查看>>
Activity生命周期
查看>>
HTML中head头结构
查看>>
sql server和mysql中分别实现分页功能
查看>>
jQuery CircleCounter的环形倒计时效果
查看>>
kafka server管理
查看>>