顺序栈的实现 C语言/C++

基本数据结构实现--顺序栈

  顺序栈是栈的顺序存储方式实现。栈的大小不可改变。可以用以下结构定义一个顺序栈:

1 typedef struct SNode {
2     ElemType data[MaxSize]; //存放栈中的元素
3     int top;    //栈顶元素在数组中的下标
4 }SqStack;

*栈的基本操作

(1) 初始化一个栈

事实上,栈顶指针可以指向栈顶元素,也可以指向栈顶元素的下一个位置,二者只是在入栈出栈等操作上略有不同。本文以栈顶指针指向栈顶元素为例,实现一个顺序栈。

将栈顶指针top置为-1,即在逻辑上初始化了一个栈。

(2) 判空

1 bool StackEmpty(SqStack S)
2 {
3     if( S.top == -1 )
4         return true;
5     return false;
6 }

(3) 进栈操作 

1 bool Push( SqStack& S,ElemType x )
2 {
3     if( S.top == MaxSize - 1 )   //栈满
4         return false;
5     S.data[++S.top] = x;
6     return true;
7 }

先将栈顶指针后移一位,再将元素送到栈顶。

(4) 出栈操作

1 bool Pop( SqStack& S,ElemType& x )
2 {
3     if( S.top == -1 )
4         return false;
5     x = S.data[S.top--];
6     return true;
7 }

先送栈顶元素出栈,再将栈顶指针前移一位。

 

*代码测试

复制代码
 1 /* 顺序栈
 2 
 3        实现操作:
 4      *1 判空
 5      *2 入栈
 6      *3 出栈
 7      *4 读栈顶元素(栈顶元素依然保留)
 8 
 9                                     */
10 #include <iostream>
11 #include <cstdio>
12 using namespace std;
13 
14 typedef int ElemType;
15 const int MaxSize = 10;
16 
17 typedef struct SNode {
18     ElemType data[MaxSize]; //存放栈中的元素
19     int top;    //栈顶元素在数组中的下标
20 }SqStack;
21 
22 //初始化一个顺序栈
23 void InitStack(SqStack& S)
24 {
25     S.top = -1;
26 }
27 
28 //判空
29 bool StackEmpty(SqStack S)
30 {
31     if( S.top == -1 )
32         return true;
33     return false;
34 }
35 
36 //进栈操作:将x压入堆栈
37 bool Push( SqStack& S,ElemType x )
38 {
39     if( S.top == MaxSize - 1 )   //栈满
40         return false;
41     S.data[++S.top] = x;
42     return true;
43 }
44 
45 //出栈操作:将栈顶元素出栈,并用x返回
46 bool Pop( SqStack& S,ElemType& x )
47 {
48     if( S.top == -1 )
49         return false;
50     x = S.data[S.top--];
51     return true;
52 }
53 
54 //读栈顶元素
55 bool GetTop( SqStack S,ElemType& x )
56 {
57     if( S.top == -1 )
58         return false;
59     x = S.data[x];
60     return true;
61 }
62 
63 void test1()
64 {
65     SqStack S;
66     InitStack(S);
67     for( int i=1; i<=11; i++ ) {
68         if( Push(S,i) ) {
69             cout << "入栈成功,入栈的元素是:" << i << endl;
70         }
71         else
72             cout << "栈满,入栈失败" << endl;
73     }
74     cout << "-----------------------" << endl;
75     while( !StackEmpty(S) ) {
76         int e ;
77         Pop(S,e);
78         cout << e << endl;
79     }
80 
81 }
82 
83 int main()
84 {
85     test1();
86     return 0;
87 }
复制代码

 

上一篇【双链表的实现C/C++】:https://www.cnblogs.com/pkuqcy/p/14951810.html

下一篇【堆栈的链式存储实现C/C++】:https://www.cnblogs.com/pkuqcy/p/14985763.html

posted @   Ann-  阅读(571)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示