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

#include <stdio.h>

#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-) //判断栈是否已满
return ERROR;
S->date[++S->top] = e; //栈顶指针加1,栈顶元素等于e
return OK;
} /*出栈操作*/
Status Pop(SeqStack *S, SElemType *e)
{
if(S->top == -) //判断栈是否为空
return ERROR;
*e = S->date[S->top--]; //将栈顶元素赋值与e,并将栈顶指针减1
return OK;
} void main()
{
SeqStack S; //创建栈S
S.top = -; //栈顶指针为-1,栈为空
int e; //入栈与出栈的元素 while(true)
{
printf("请选择对顺序栈的操作:\n");
printf("1.入栈\n");
printf("2.出栈\n");
printf("3.退出\n");
int a;
scanf("%d", &a);
switch(a)
{
case :
printf("请输入入栈的元素:");
scanf("%d", &e);
if(Push(&S, e))
printf("入栈成功\n");
else
printf("入栈失败\n");
break;
case :
if(Pop(&S, &e))
printf("出栈的元素为:%d\n",e);
else
printf("栈空\n");
break;
case :
return;
default:
printf("选择错误\n");
break;
}
}
}

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

#include<stdio.h>
#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 + == S->top2) //判断栈是否已满
return ERROR;
if(flag == ) //若flag等于1,则对栈1操作
S->date[++S->top1] = e; //将栈1指针加1,并赋值为e
if(flag == ) //若为2,对栈2操作
S->date[--S->top2] = e; //将栈2指针减1,并赋值为e
return OK;
} /*双向栈的出栈操作*/
Status Pop(SeqDoubleStack *S, int flag, ElemType *e)
{
if(flag == && S->top1 != -) //若flag为1且栈1栈顶不是-1
{
*e = S->date[S->top1--]; //将栈顶元素赋值给e,并将栈顶减1
return OK;
}
if(flag == && 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,栈为空
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 :
printf("请输入入栈1的元素:");
scanf("%d", &e);
if(Push(&S, , e))
printf("入栈成功\n");
else
printf("入栈失败\n");
break;
case :
printf("请输入入栈2的元素:");
scanf("%d", &e);
if(Push(&S, , e))
printf("入栈成功\n");
else
printf("入栈失败\n");
break;
case :
if(Pop(&S, , &e))
printf("出栈的元素为:%d\n",e);
else
printf("栈空\n");
break;
case :
if(Pop(&S, , &e))
printf("出栈的元素为:%d\n",e);
else
printf("栈空\n");
break;
case :
return;
default:
printf("选择错误\n");
break;
}
}
}

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

最新文章

  1. Dcloud HTML5 监听蓝牙设备 调用 原生安卓实现
  2. 2.1---删除链表中重复元素(CC150)
  3. WITH AS的含义
  4. leetcode 122. Best Time to Buy and Sell Stock II ----- java
  5. DTCMS使用ajax局部刷新
  6. 反编译c#的相关问题
  7. 【HDU 5233】Tree chain problem (树形DP+树剖+线段树|树状数组)最大权不相交树链集
  8. perl 自动发产品
  9. Struts2基础学习(二)&mdash;Action
  10. 都是Javascript的作用域惹得祸
  11. PHP 404页面/如何设置404页面/URL静态化/URL伪静态化
  12. 【剑指offer】数组中只出现一次的数字
  13. 详解如何在 Linux 中安装最新的 Python 3.6 版本
  14. [转]MyEclipse内存不足问题
  15. DNS污染
  16. ThreadDeath 理解
  17. C# Winform下一个热插拔的MIS/MRP/ERP框架13(窗体基类)
  18. Tomcat 没有自动解压webapp下的war项目文件问题
  19. 6. Laravel5学习笔记:IOC/DI的理解
  20. ASP.NET MVC性能优化(实际项目中)

热门文章

  1. 我的【Java】面试日记
  2. IoTClient开发4 - ModBusTcp协议服务端模拟
  3. Python Socket学习之旅(一)
  4. 双十一还在盖楼?少年你应该掌握Docker 部署 Consul了
  5. Python类属性与实例属性理解
  6. Vue的指令以及组件化开发
  7. 小白历险记:spingboot之helloworld
  8. ASP.NET购物车Cookie获取,创建,添加,更新,删除的用法
  9. 反汇编分析NSString,你印象中的NSString是这样吗
  10. 手摸手带你认识https涉及的知识,并实现https加密解密,加签解签