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

#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;
}
}
}

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

顺序栈与两栈共享空间-C语言实现的更多相关文章

  1. 02两栈共享空间_DoubleStack--(栈与队列)

    #include "stdio.h" #include "stdlib.h" #include "io.h" #include " ...

  2. C语言实现两栈空间共享

    一个同学让我改一段两栈共享的C语言代码,实现进栈.出栈.输出栈里元素的功能. 代码如下: #include <stdio.h> #include <stdlib.h> #def ...

  3. HDU 1022 Train Problem I[给出两个长n的串,入栈和出栈顺序,判断入栈顺序是否可以匹配出栈顺序]

    Train Problem I 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 As the new term comes, the Ignatius Train Sta ...

  4. C++模板实现动态顺序表(更深层次的深浅拷贝)与基于顺序表的简单栈的实现

    前面介绍的模板有关知识大部分都是用顺序表来举例的,现在我们就专门用模板来实现顺序表,其中的很多操作都和之前没有多大区别,只是有几个比较重要的知识点需要做专门的详解. #pragma once #inc ...

  5. Linux网络栈下两层实现

    http://www.cnblogs.com/zmkeil/archive/2013/04/18/3029339.html 1.1简介 VLAN是网络栈的一个附加功能,且位于下两层.首先来学习Linu ...

  6. N个数依次入栈,出栈顺序有多少种

    题目:N个数依次入栈,出栈顺序有多少种? 首先介绍一下卡特兰数:卡特兰数前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 2 ...

  7. C++栈学习——顺序栈和链栈的差别

    C++中栈有顺序栈和链栈之分.在顺序栈中,定义了栈的栈底指针(存储空间首地址base).栈顶指针top以及顺序存储空间的大小stacksize(个人感觉这个数据成员是能够不用定义的) //顺序栈数据结 ...

  8. n个元素的入栈顺序有多少种出栈顺序?

    问题:w1.w2.w3.w4.w5,5个元素将会按顺序入栈,求出栈顺序有多少种情况. 先写一下结论方便记忆: 1个元素:1种 2个元素:2种 3个元素:5种 4个元素:14种 5个元素:42种 简单的 ...

  9. N个数依次入栈,出栈顺序有多少种?

    对于每一个数来说,必须进栈一次.出栈一次.我们把进栈设为状态‘1’,出栈设为状态‘0’.n个数的所有状态对应n个1和n个0组成的2n位二进制数.由于等待入栈的操作数按照1‥n的顺序排列.入栈的操作数b ...

随机推荐

  1. MIT线性代数:2.消元法

  2. CSPS模拟 43

    我这次把考试题改完了 T1 A 发现S*b必须和T模a同余? 貌似乘不了几次就爆T了?可以暴力? 也许乘的越多越好? 内心:切了 另外怎么设置鼠标指到黑块上边就显示字那种东西 最后当然是因为低错没有A ...

  3. FastJson稍微使用不当就会导致StackOverflow

    GitHub 9.4k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 9.4k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 9.4k Star 的 ...

  4. LeetCode刷题总结-数组篇(番外)

    本期共7道题,三道简单题,四道中等题. 此部分题目是作者认为有价值去做的一些题,但是其考察的知识点不在前三篇总结系列里面. 例1解法:采用数组索引位置排序的思想. 例2解法:考察了组合数学的组合公式应 ...

  5. VIM编辑器的常用命令及使用!

    在热门Linux操作系统中都会默认安装一款超好用的文本编辑器——名字叫“vim”,vim是vi编辑器的升级版. Vim能够得到这么多厂商与用户的认可,原因就是在Vim编辑器中有三种模式——命令模式.末 ...

  6. .Net Core Vue Qucik Start

    .Net Core Vue Qucik Start This is a ASP.NET Core 3.0 project seamlessly integrationed with Vue.js te ...

  7. [转载]1.3 UiPath变量的介绍和使用

    一.变量 变量主要用于存储数据,它在RPA中扮演重要的数据传递角色,是RPA编程不可或缺的一部分.它包括变量名称和变量的值,变量的值支持多种数据类型,包括从通用值,文本,数字,数据表,时间和日期,Ui ...

  8. React第一次渲染为何容易出现TypeError: Cannot read property 'XX' of undefined

    此题可能大家会不屑一顾,哎,错误都给你怼脸上了你还不会嘛,其实大家有没有认真思考过这其中的原因.先上一张错误图,剩余的全靠编.没兴趣看图的老铁们可以拉到最底下直接看结论 错误:  代码: 其次,我再把 ...

  9. TCP--文件上传

    客户端 public class Test2_UpdateClient { public static void main(String[] args) throws UnknownHostExcep ...

  10. 接口测试专题(Java & jmeter & Linux基础)

    以下是我和两个朋友原创文章合集,主题是接口测试,有Java接口测试案例和jmeter的案例,还有接口测试相关服务器操作基础.欢迎点赞.关注和转发. 接口测试 httpclient处理多用户同时在线 h ...