多语言展示
当前在线:1319今日阅读:175今日分享:29

C语言数据结构之线性序列结构栈(纯数组静态栈)

栈是一种先进后出的线性表结构,也是一种操作受限的线性表。 本经验主要讲解纯数组静态栈的一些操作,动态数组栈的操作原理也相似。主要操作有初始化静态栈、判断静态栈是否为空、判断静态栈是否已满、静态栈入栈/压栈、静态栈出栈、显示静态栈中数据、获取静态栈已使用空间、获取静态栈剩余空间等等。
工具/原料

Visual Studio 2013

方法/步骤
1

【1】打开Visual Studio 2013软件,并创建Win32控制台应用程序。  【2】添加头文件#include 'stdafx.h'#include 'stdio.h'#include 'malloc.h'#include 'stdbool.h' 【3】验证创建工程的完整性和正确性void main(void){ printf('Hello Word......\r\n'); while (1);}

2

【1】栈类型定义。因为只是纯数组静态栈故只需要栈顶即可,无需栈底。#define STACK_MAX_SIZE 6 //栈大小 typedef struct stcStack{ int StackTop; //栈顶 int StackData[STACK_MAX_SIZE]; //栈数据区}stcStack, *pStcStack;  【2】初始化静态栈。栈顶为-1,即pStak->StackTop = -1,再显示栈顶和栈容量大小。 //初始化堆栈void InitStaticStack(pStcStack pStak){ pStak->StackTop = -1;  printf('静态栈初始化成功......\r\n'); printf('最大容量: %d\r\n', STACK_MAX_SIZE); printf('栈顶    : %d\r\n\r\n', pStak->StackTop);}  【3】验证初始化栈的情况,先定义一个栈变量,即stcStack Stak。void main(void){ stcStack Stak;  InitStaticStack(&Stak);//初始化堆栈 while (1);}

3

【1】判断静态栈是否已满,当栈顶加1大于等于栈最大容量时,则栈已满,否则栈未满。 //判断栈是否为满bool IsFullStaticStack(pStcStack pStak){ if ((pStak->StackTop + 1) >= STACK_MAX_SIZE) return true; else return false;}  【2】判断静态栈是否为空,当栈顶为-1时,则栈为空,初始化转态pStak->StackTop = -1。 //判断栈是否为空bool IsEmptyStaticStack(pStcStack pStak){ if (pStak->StackTop == -1) return true; else return false;}  【3】静态栈的入栈/压栈。在栈未满的情况下,将数据存放到栈顶为下标的数组中,然后栈顶加1。 //入栈/压栈void PushStaticStack(pStcStack pStak, int value){ if (IsFullStaticStack(pStak)) { printf('静态栈已满,入栈失败......\r\n'); printf('最大容量: %d\r\n', STACK_MAX_SIZE); printf('栈顶    : %d\r\n\r\n', pStak->StackTop); return; }  pStak->StackData[++pStak->StackTop] = value;//入栈值 printf('入栈成功!入栈值为: %d\r\n', value);}  【4】验证入栈情况,将数据入栈中,入栈成功显示入栈数据。void main(void){ stcStack Stak;  InitStaticStack(&Stak);//初始化堆栈  PushStaticStack(&Stak, 6);//入栈/压栈 PushStaticStack(&Stak, -5); PushStaticStack(&Stak, 13); PushStaticStack(&Stak, 2); PushStaticStack(&Stak, 67); while (1);}  【5】显示静态栈中所有数据,在非空栈情况下,从栈顶逐个显示占中数据。即先进后出的显示方式。 //显示栈中数据void ShowStaticStack(pStcStack pStak){ int i = 0;  if (IsEmptyStaticStack(pStak)) { printf('静态栈为空,显示失败......\r\n'); printf('栈顶 : %d\r\n\r\n', pStak->StackTop); return; }  printf('静态栈内容 : '); for (i = pStak->StackTop; i >=0 ; i--) printf('%d  ', pStak->StackData[i]); printf('\r\n');}

4

【1】获取静态栈已使用空间大小,已使用空间为栈顶加1,即pStak->StackTop + 1。 //获取栈使用空间int CountStaticStack(pStcStack pStak){ if (IsEmptyStaticStack(pStak)) printf('静态栈为空......'); if (IsFullStaticStack(pStak)) printf('静态栈已满......'); printf('栈使用空间 : %d\r\n', (pStak->StackTop + 1)); return (pStak->StackTop + 1);}  【2】验证静态栈已使用空间的正确性。void main(void){ stcStack Stak;  InitStaticStack(&Stak);//初始化堆栈  PushStaticStack(&Stak, 6);//入栈/压栈 PushStaticStack(&Stak, -5); PushStaticStack(&Stak, 13); PushStaticStack(&Stak, 2); PushStaticStack(&Stak, 67); ShowStaticStack(&Stak);//显示栈中数据 CountStaticStack(&Stak);//获取栈使用空间 printf('\r\n');  while (1);}  【3】获取静态栈剩余空间大小,剩余空间大小为栈总容量大小减去已使用空间大小,即STACK_MAX_SIZE - (pStak->StackTop + 1) //获取栈剩余大小int ResidueStaticStack(pStcStack pStak){ if (IsEmptyStaticStack(pStak)) printf('静态栈为空......');  if (IsFullStaticStack(pStak)) printf('静态栈已满......'); printf('栈剩余大小 : %d\r\n', (STACK_MAX_SIZE - (pStak->StackTop + 1))); return (STACK_MAX_SIZE - (pStak->StackTop + 1));}  【4】验证剩余栈空间大小void main(void){ stcStack Stak;  InitStaticStack(&Stak);//初始化堆栈  PushStaticStack(&Stak, 6);//入栈/压栈 PushStaticStack(&Stak, -5); PushStaticStack(&Stak, 13); PushStaticStack(&Stak, 2); PushStaticStack(&Stak, 67); ShowStaticStack(&Stak);//显示栈中数据 CountStaticStack(&Stak);//获取栈使用空间 ResidueStaticStack(&Stak);//获取栈剩余大小 printf('\r\n');  while (1);}

5

【1】出栈,在非空栈的情况下,将栈顶数据返回,并且栈顶减1,即res = pStak->StackData[pStak->StackTop--] //出栈int PopStaticStack(pStcStack pStak){ int res = 0;  if (IsEmptyStaticStack(pStak)) { printf('静态栈为空,出栈失败......\r\n'); printf('栈顶 : %d\r\n\r\n', pStak->StackTop); return res; }  res = pStak->StackData[pStak->StackTop--];//出栈值 printf('出栈成功!出栈值为: %d\r\n', res);}  【2】验证出栈操作。void main(void){ stcStack Stak;  InitStaticStack(&Stak);//初始化堆栈  PushStaticStack(&Stak, 6);//入栈/压栈 PushStaticStack(&Stak, -5); PushStaticStack(&Stak, 13); PushStaticStack(&Stak, 2); PushStaticStack(&Stak, 67); ShowStaticStack(&Stak);//显示栈中数据 CountStaticStack(&Stak);//获取栈使用空间 ResidueStaticStack(&Stak);//获取栈剩余大小 printf('\r\n');   PopStaticStack(&Stak);//出栈 printf('\r\n');  while (1);}   【3】验证栈初始化、入栈、出栈、使用空间、剩余空间、显示栈数据。void main(void){ stcStack Stak;  InitStaticStack(&Stak);//初始化堆栈  PushStaticStack(&Stak, 6);//入栈/压栈 PushStaticStack(&Stak, -5); PushStaticStack(&Stak, 13); PushStaticStack(&Stak, 2); PushStaticStack(&Stak, 67); ShowStaticStack(&Stak);//显示栈中数据 CountStaticStack(&Stak);//获取栈使用空间 ResidueStaticStack(&Stak);//获取栈剩余大小 printf('\r\n');   PopStaticStack(&Stak);//出栈 PopStaticStack(&Stak); PopStaticStack(&Stak); PopStaticStack(&Stak); ShowStaticStack(&Stak);//显示栈中数据 CountStaticStack(&Stak);//获取栈使用空间 ResidueStaticStack(&Stak);//获取栈剩余大小 printf('\r\n');  while (1);}

6

【1】栈操作中的所有API#define STACK_MAX_SIZE 6 //栈大小 typedef struct stcStack{ int StackTop; //栈顶 int StackData[STACK_MAX_SIZE]; //栈数据区}stcStack, *pStcStack;  //初始化堆栈void InitStaticStack(pStcStack pStak) //判断栈是否为空bool IsEmptyStaticStack(pStcStack pStak) //判断栈是否为满bool IsFullStaticStack(pStcStack pStak) //入栈/压栈void PushStaticStack(pStcStack pStak, int value) //出栈int PopStaticStack(pStcStack pStak) //显示栈中数据void ShowStaticStack(pStcStack pStak) //获取栈使用空间int CountStaticStack(pStcStack pStak) //获取栈剩余大小int ResidueStaticStack(pStcStack pStak

注意事项
1

本人原创经验,仅供参考,若有不足之处请留言指正,若觉得写得好或凑合的话,请点击本页面左下角投票,谢谢了\(^o^)/

2

若有任何意见与帮助,请关注后私信留言,非喜勿喷

3

需要相关帮助请投票后关注私信

推荐信息