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

By | 05月06日
Advertisement

栈和队列都有两种实现方式,一种在之前已经写过了,是链式存储形式,另一种是顺序存储形式。也就是这里所写的用数组的形式实现,和链式存储形式相比,有几个不同的地方。

  1. 顺序存储的方式,必须确定栈和队列的大小,也就是要确定数组的大小。而链式储存是动态分配的,根据需要来增减。
  2. 顺序存储的方式有溢出的现象,由于是数组存储,所以超出数组下标的时候就溢出了。

下面上代码:

SequentialStack.h 顺序存储栈头文件

#ifndef _SEQUENTIALSTACK_H_H #define _SEQUENTIALSTACK_H_H  typedef int SStackEle; const int MAXSTACK = 20;  typedef struct SSTACK {   SStackEle arrele[MAXSTACK];     SStackEle top; }SStack;  //初始化顺序栈 void InitSStack(SStack &s);  //压入栈 void PushSStack(SStack &s, SStackEle ele);  //出栈 void PopSStack(SStack &s, SStackEle &ele);  //判断栈是否为空 bool IsemptySStack(SStack s);  //得到栈顶元素 SStackEle GetTopSStack(SStack s);  #endif

SequentialQueue.h 顺序存储队列头文件

#ifndef _SEQUENTIALQUEUE_H_H #define _SEQUENTIALQUEUE_H_H  typedef int SQueueEle; const int MAXQUEUE = 10;  typedef struct SQUEUE {  SQueueEle arrele[MAXQUEUE];     SQueueEle front, rear; }SQueue;  //初始化顺序队列 void InitSQueue(SQueue &q);  //入队 void EnSQueue(SQueue &q, SQueueEle ele);  //出队 void DeSQueue(SQueue &q, SQueueEle &ele);  //判断队列是否为空 bool IsemptySQueue(SQueue q);  //获得队头元素 SQueueEle GetFrontSQueue(SQueue q);  #endif

SequentialStack.cpp 顺序存储栈源文件

#include "SequentialStack.h" #include <stdio.h>  //初始化顺序栈 void InitSStack(SStack &s) {  s.top = -1; }  //压入栈 void PushSStack(SStack &s, SStackEle ele) {    s.top++;    if (s.top < MAXSTACK)        s.arrele[s.top] = ele;  else        printf("栈满,不能进行压入操作!n"); }  //出栈 void PopSStack(SStack &s, SStackEle &ele) {    if (s.top < 0)       printf("栈空,不能进行出栈操作!n");    else    {       ele = s.arrele[s.top];      s.top--;    } }  //判断顺序栈是否为空 bool IsemptySStack(SStack s) {     if (s.top = -1)         return true;    else        return false; }  //获得栈顶元素值 SStackEle GetTopSStack(SStack s) {   if (s.top < 0)       printf("栈空,不能获得栈顶元素值!n");   else        return s.arrele[s.top]; }

SequentialQueue.cpp 顺序存储队列源文件

#include "SequentialQueue.h" #include <stdio.h>  //初始化顺序队列 void InitSQueue(SQueue &q) {    q.front = q.rear = -1; }  //入队列 void EnSQueue(SQueue &q, SQueueEle ele) {   if (q.rear >= MAXQUEUE)      printf("队列满,不能进行入队操作!n");   else        q.arrele[++q.rear] = ele; }  //出队列 void DeSQueue(SQueue &q, SQueueEle &ele) {   if (IsemptySQueue(q))       printf("队列空,不能进行出队操作!n");   else        ele = q.arrele[++q.front]; }  //判断队列是否为空 bool IsemptySQueue(SQueue q) {     if (q.front == q.rear)      return true;    else        return false; }  //获得队头元素值 SQueueEle GetFrontSQueue(SQueue q) {     if (IsemptySQueue(q))       printf("队空,不能获得队头元素值!n");   else        return q.arrele[q.front + 1]; }

main.cpp 测试程序源文件

#include <stdio.h> #include "SequentialStack.h" #include "SequentialQueue.h"  int main() {    /*顺序栈测试代码*/     int ele;    SStack s;   InitSStack(s);      PushSStack(s, 0);   PushSStack(s, 1);   PushSStack(s, 2);   printf("栈顶元素值为:%dn", GetTopSStack(s));      PopSStack(s, ele);  printf("出栈第1个元素是:%dn", ele);    printf("栈顶元素值为:%dn", GetTopSStack(s));      PopSStack(s, ele);  printf("出栈第2个元素是:%dn", ele);    PopSStack(s, ele);  printf("出栈第3个元素是:%dn", ele);    PopSStack(s, ele);      if (IsemptySStack(s))       printf("栈为空!n");    putchar('n');   /*顺序队列测试代码*/    SQueue q;   InitSQueue(q);      EnSQueue(q, 0);     EnSQueue(q, 1);     EnSQueue(q, 2);     printf("队头元素值为:%dn", GetFrontSQueue(q));    DeSQueue(q, ele);   printf("出队第1个元素是:%dn", ele);    printf("队头元素值为:%dn", GetFrontSQueue(q));    DeSQueue(q, ele);   printf("出队第2个元素是:%dn", ele);    DeSQueue(q, ele);   printf("出队第3个元素是:%dn", ele);    DeSQueue(q, ele);   if (IsemptySQueue(q))       printf("队列为空!n");   return 0; }

下面附测试结果图一张:

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

PS:个人测试没有问题,如果大家发现问题请及时联系,不胜感激!

Similar Posts:

  • 学习笔记------数据结构(C语言版)栈和递归 汉诺塔

    //main.cpp #include "predefined.h" #include "SqStack.h" int c=0; void move(char a,int m,char b); void hanoi(int n,char x,char y,char z); int main() { int n=5; char x='x'; char y='y'; char z='z'; hanoi(n,x,y,z); } void hanoi(int n,char

  • c语言版数据结构(奇迹冬瓜)-队列实战(1)离散事件模拟(银行排队)

    //c语言版数据结构(奇迹冬瓜)-队列实战(1)离散事件模拟(银行排队) //------头文件--------- #include<stdio.h> #include<stdlib.h> #include<time.h> //-------宏定义--------- #define TURE 1 #define ERROR 0 #define OVERFLOW -2 //------替换及结构体------ typedef int Bool; typedef struc

  • c语言版数据结构(奇迹冬瓜)-栈实战(3)括号匹配的检测

    //c语言版数据结构(奇迹冬瓜)-栈实战(3)括号匹配的检测 /* 初始化栈 初始化标志位 循环标志位不为1 { 输入一个字符并判断是否为括号 如果是<[{(则进栈 如果是>]})则出栈 { 判断出栈的字符和输入的字符是否相等 { 相等则继续 否则标志位为0 } } 判断栈空否 { 栈空则标志位为0 } } 判断栈空的情况 { 栈空匹配 否则不匹配 } */ //---------头文件---------- #include<stdio.h> #include<stdlib.

  • c语言版数据结构(奇迹冬瓜)-栈实战(4)表达式求值

    //c语言版数据结构(奇迹冬瓜)-栈实战(4)表达式求值 /* 这个算法难的不是思想,而是尽可能的解决输入格式的问题 这个程序还有两个问题没有解决可以实现输出负数,但是不能输入负数,一旦输入时括号不匹配会发生错误. 主要思想: 利用两个栈,一个存放字符运算符,一个来存放整数. 其中涉及整数的转换和表达式的格式检测及算符之间的优先级. 本算法还很不工整优化. */ //-----头文件------ #include<stdio.h> #include<stdlib.h> //----

  • 数据结构与算法(C语言版)__栈

    栈是一种常用的数据结构,栈常用在系统软件和或者算法中. 栈使用数组来做顺序栈,链式站用链表来做.今天使用动态数组来设计栈. 栈,后进先出(LIFO),先进后出(FILO) push,进栈 pop,出栈 peek,看一下栈顶 我使用的是VS Ultimate2013 新建一个空项目,在头文件里面添加两个头文件MyStack.h和MyUtil.h 在源文件里面添加main.cpp //MyUtil.h //当栈的长度不够时,自动扩大两倍 #ifndef _MYUTIL_H #define _MYUT

  • 二叉树的中序非递归遍历c语言版

    由于c语言没有c++的STL库,我们无法借助c++的stack库实现二叉树的非递归遍历,但是,我们完全可以自己打造一个c语言版的stack库.本篇博文就是借助我们之前在栈的链 式存储API http://blog.csdn.net/bbs375/article/details/52728358这篇博文实现的程序.当然,你也可以把它编译成动态库dll(可以参考如何封装自己的动态库应用案例http://blog.csdn.net/bbs375/article/details/52668322)放到自

  • 清华大学出版社 数据结构(C语言版)的实现

    我使用的教材是清华大学出版社数据结构(C语言版),以下是我在学习记录. 一.数据结构(C语言版)第二章顺序线性表的实现 二.合并两个线性表的实现 三.基于线性表:编写26个字母按特定字母值插入或删除的完整程序 四.基于链表:逆置带头结点的单链表 五.基于链表:输入若干整数以单链表形式存储起来,然后计算单链表中结点的个数 六.基于链表:键盘输入若干个整数,按输入数据逆序建立一个带头结点的单链表 (持续更新...)

  • POJ 3278 Catch That Cow【C语言版】

    我的第一道BFS题,还是按照习惯在网上搜索题解,令人郁闷的是大部分都是C++版的,用了queue库.而且可能因为这道题太水,好不容易找到的C语言版的解题报告中的注释又对新手不太友好,不是特别详细,有的讲的很齐全但是代码太难看了我拒绝看 = =...知道我遇到了这个人的博客,当然注释也不是很齐全,但是胜在代码啰嗦(划掉),马上就看懂了.所以我决定在他的解题报告代码的帮助下来开始我人生中第一道BFS题(这意味着我的代码也是啰嗦的),很感谢原博主的题解. http://blog.csdn.net/u0

  • JAVA语言版之记事本

    如有意见可以评价,转载请标明出处,谢谢! 这段时间开始学JAVA,想通过编一些小的程序来加深对JAVA语言的学习,后来决定从记事本这个程序开始,花了一段时间总算写好了,现在和大家分手一下实现的过程. 记事本程序主要是通过菜单项和工具栏按键来操作文件的一种应用程序,顾名思义,我们需要定义一个窗体,并向这个窗体中添加菜单和工具栏.这里我使用的是用JFrame作为主窗体.一般不拿JDialog作为主窗体,JDialog可以从属于一个JFrame,JWindow也可以作为主窗体. 首先我们定义一个类,继

  • 求最大子序列的四种算法,数据结构与算法分析(C语言版)第二章

    /************************************************************************* File Name: maxSubSequence.c Author: *** Mail: *******@**.com Created Time: 2015年07月18日 19:38:14 Description:求最大子序列的四种算法,数据结构与算法分析(C语言版)第二章 ************************************

Tags: