一、顺序栈

1.定义结构:

#include<stdio.h>
#include<stdlib.h>            //malloc和realloc函数的库
#define maxsize 100           //宏不需要加';'
typedef struct  {int data[maxsize];int top;
}myStack,*Stack;

顺序栈类似于顺序表,栈中的元素可以用一个一维数组来保存,同时也要有最大值;而且还要包括一个栈顶top指针,因为栈底指针可任意为一个端点,所以可省略。

2.判空栈:

//判空栈int Empty(Stack L){if(L->top==-1) return 1;   //为空栈else return 0;            //不为空栈}

判空栈需要注意的是:栈顶指针刚开始是为-1

栈满对于顺序栈来说就是等于maxsize,在此不多说。

3.计算栈的长度:

int length(myStack *s)       //计算栈中元素的个数
{printf("\n此时栈的长度为%d\n",s->top+1);
}

顺序栈的长度=top指针+1的数。

4.取栈顶元素:

//取栈顶元素
int get(myStack *s){if(Empty(s)) printf("栈空!"); //栈空 else printf("栈顶元素为:%d\n",s->data[s->top]);  //因为data存放在一维数组所以取的时候遵循数组的写法
} 

5.初始化:

//初始化栈int Init(myStack *&s) {s=(myStack *)malloc(sizeof(myStack));  //定义空间结点s->top=-1;               //栈空:top==-1return 1;} 

6.入栈:

 //入栈
int push(myStack *&s, int e)  //元素e入栈
{if(s -> top == maxsize - 1)return 0;else{s -> top++;             //栈顶指针加一 s -> data[s -> top] = e;//新插入的元素进栈 return 1;}
}

7.出栈:

//出栈void pop(Stack L){int i=0 ;if(Empty(L)) printf("栈空!");  //栈空while(i<=L->top){                     //i<栈顶时,输出,栈顶-- printf("%d ",L->data[L->top]);L->data[L->top]=0;               //将出栈的元素位置赋值0 L->top--;}}

这里根据自己思路写的,也能实现,将出栈的元素赋值为0,在遍历的时候以这个条件为基本在视觉效果较好的情况下遍历。

8.总体main函数:

int main(){myStack *s;                //定义栈 if(Init(s)==1){           //初始化栈printf("初始化成功!\n"); }printf("-----进行1-5的入栈:\n");printf("入栈顺序为: ") ;for(int i=1;i<=5;i++){printf("%d ",i);push(s,i);}length(s);                 //求栈长 get(s);                   //取栈顶元素 printf("-----进行1-5的出栈:\n");printf("出栈顺序为: ");pop(s);                 //出栈 length(s);              //求栈长 }

9.运行如图:

二、双向栈(左栈和右栈)共享一个空间

双向栈用于存储空间较大时,顺序栈无法满足,从而导致溢出或者空闲情况。

特性:栈底指针不变,栈顶指针动态变化;左右两个栈的最大空间均大于maxsize/2.

1.结构定义:

#include<stdio.h>
#include<stdlib.h>
#define maxsize 10             //宏不需要加';'
typedef struct {int data[maxsize];int left;                          //左栈top int right;                         //右栈top
}DoubleStack,*Double;

2.初始化:

左栈和右栈的起始地都是从有效空间后一位开始的,左栈从前往后是递增,右栈是从后往前是递增。

//初始化int Init(Double &L){L=(Double)malloc(sizeof(DoubleStack));if(L==NULL) return -1;L->left=-1;                 //左栈有效位后一位:-1 L->right=maxsize;           //右栈有效位后一位:maxsize return 1; }

3.入栈:

入栈要存在一个status的判断,个人定义为1时是左栈,为2时是右栈。

//入栈
int push(Double &L,int status,int x){   //status=1代表左数,=2代表右树 if(L->left+1==L->right){printf("栈满!");return -1;} if(status==1){L->left++;            //左指针往后L->data[L->left]=x;   //赋值}else if(status==2){L->right--;           //右指针往前L->data[L->right]=x;   //赋值}
}

4.出栈:

出栈元素的值个人先将它输出在定义为0,在遍历时借用这个条件可以输出视觉感官较好的形式。

//出栈
int pop(Double &L,int status) {if(status==1){if(L->left<0) {printf("左栈为空!\n"); return -1;}else{printf("出%d ",L->data[L->left]);    //输出要出栈的元素 L->data[L->left]=0;                  //将data[L->left]赋值0 L->left--;}}else if(status==2){if(L->right>maxsize-1){printf("右栈为空!\n"); return -1;}else{printf("出%d ",L->data[L->right]);   //输出要出栈的元素L->data[L->right]=0;                 //将data[L->right]赋值0 L->right++;}}
}

5.遍历:

如果元素的值为0,则输出[]。

//遍历栈 void Print(Double &L) {int i,j;for(i=0;i<=maxsize-1;i++){     if(L->data[i]!=0){                 //如果元素出栈则出栈函数赋值为0;输出[] printf("%d ",L->data[i]);}else{printf("[]");} }}

6.main函数:

int main(){DoubleStack *s;char L,R;if(Init(s)==1){printf("初始化成功!\n");}printf("进行1-5的入栈(左右同时):\n");for(int i=1;i<=5;i++){         //for循环来输入栈 push(s,1,i);               //1代表左栈 push(s,2,i);               //2代表右栈 }printf("此时栈的元素为:");Print(s);printf("\n进行一次左栈出栈:\n"); pop(s,1);printf("\n进行一次右栈出栈:\n"); pop(s,2); printf("\n此时栈的元素为:");Print(s);
} 

7.运行如图:

在此声明:本文两个图是借用其他博主的图。

顺序栈和双向顺序栈的操作相关推荐

  1. (C语言版)栈和队列(二)——实现顺序存储栈和顺序存储队列的相关操作

    http://blog.csdn.net/fisherwan/article/details/21479649 栈和队列都有两种实现方式,一种在之前已经写过了,是链式存储形式,另一种是顺序存储形式.也 ...

  2. java顺序栈和链栈_Java的顺序栈和链式栈

    栈的定义 栈是限制在表的一段进行插入和删除的运算的线性表,通常能够将插入.删除的一端为栈顶,例外一端称为栈底,当表中没有任何元素的时候称为空栈. 通常删除(又称"退栈")叫做弹出p ...

  3. 21.判断栈弹出顺序是否正确

    题目描述:   输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1 ...

  4. java 顺序栈_Java实现顺序栈

    一.分析 栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表. 顺序栈是指利用顺序存储结构实现 ...

  5. 栈的push、pop序列-判断序列是否是栈的pop顺序

    程序员面试题精选100题(24)-栈的push.pop序列[数据结构] 题目:输入两个整数序列.其中一个序列表示栈的 push 顺序,判断另一个序列有没有可能是对应的 pop 顺序.为了简单起见,我们 ...

  6. 数据结构--顺序表、链表、栈、队列、树、文件(visual studio可运行)

    顺序表的顺序存储(增删查) #include <stdio.h> #include <stdlib.h> #define MaxSize 50 typedef int Elem ...

  7. 数据结构:顺序栈基本操作(入栈和出栈)C语言详解(转载)by解学武

    本文为解学武教程的免费章节 什么是顺序栈 顺序栈,即用顺序表实现栈存储结构.通过前面的学习我们知道,使用栈存储结构操作数据元素必须遵守 "先进后出" 的原则,本节就 "如 ...

  8. 简述顺序表、链表、栈和队列以及队列实现栈、栈实现队列

    简述顺序表.链表.栈和队列以及队列实现栈.栈实现队列 顺序表Vector 原理 使用方法 优点和缺点 链表List 原理 使用方法 优点和缺点 栈Stack 定义和特点 使用方法 队列 定义和特点 使 ...

  9. c语言堆栈基本代码入栈出栈_顺序栈基本操作(入栈和出栈)C语言详解

    顺序,即用{1,2,3,4},存储状态如 图 1 顺序表存储 {1,2,3,4} 同样,使用栈存储结构存储 {1,2,3,4},其存储状态如图 2 所示: 图 2 栈结构存储 {1,2,3,4} 通过 ...

最新文章

  1. 【Python】在模仿中精进数据可视化09:近期基金涨幅排行可视化
  2. docker harbor 域名_超详细的搭建docker私服Harbor教程
  3. ant external lib
  4. Spring-Cloud中的 熔断、限流、降级
  5. 【转】OWIN是什么?
  6. check的用法java_Java ChronoField checkValidValue()用法及代码示例
  7. b - 数据结构实验之查找二:平衡二叉树_二叉树、平衡二叉树、红黑树、B树、B+树与B*树...
  8. html5积分墙联盟,积分墙是一种革新的移动广告联盟
  9. 培训班出身的程序员,未来何去何从?
  10. 微服务:服务治理来保证高可用
  11. 51驱动DS1302制作电子时钟1602显示
  12. 外汇天眼:开仓、平仓、持仓、锁仓是什么意思?
  13. 数学符号 - 罗马字母
  14. Centos7.3安装TP-LINK驱动 TL-WDN5200H
  15. AS安装模拟器要安装加速器
  16. 传统人工智能中的三大问题
  17. 说说Linux的用途
  18. w ndows无法连接到System,电脑无法连接到System Event Notification Service服务
  19. 传输速率、带宽、吞吐量
  20. 基于miu小波变换的人体步态数据检测和识别算法matlab仿真

热门文章

  1. Linux xz文件的压缩解压
  2. java计算机毕业设计vue图书档案管理系统MyBatis+系统+LW文档+源码+调试部署
  3. 脑电信号处理——加入通道注意力(利用可训练张量)
  4. PCG(preconditioned conjugate gradient)
  5. linux中dare命令,dare
  6. 回望过去三年(作为程序猿踏入社会的三年)
  7. Hadoop Day06~MapReduce计算json文件的电影总分
  8. 从零开始开发物联网项目(1)——mqtt服务器搭建
  9. ThinkPHP5 采集网页的指定内容
  10. python矩阵定义_python定义矩阵