[C++]数据结构:栈之顺序栈

0 栈的基本概念

栈,根据存储结构的不同,可分为:链栈和顺序栈。

1 顺序栈的知识概览

2 编程复现

2.1 定义基本数据结构

typedef char DataType; // 基本数据类型 

enum Status { ERROR, OK, OVERFLOW };// 状态(码) : 枚举类型 

#define MAXSIZE_STACK 100 //栈内最大元素数 

typedef struct { // 顺序栈
    DataType *base; // 栈底指针 (NULL:栈结构不存在;【重点】 初始化后,始终指向栈底)
    DataType *top;  //栈顶指针 【重点】(初始时:top==base; top所指处无任何元素)
    int stackSize;  //栈可用的最大容量
}SeqStack; 

2.2 基本操作

Status InitStack(SeqStack &S); //初始化
Status Push(SeqStack &S, DataType e); //入栈
Status Pop(SeqStack &S, DataType &e); //出栈
bool StackEmpty(SeqStack S); //判定栈空
bool StackFull(SeqStack S); //判定栈满
Status GetTop(SeqStack S, DataType &e); //取得栈顶元素
int StackLength(SeqStack &S); //栈的长度
Status StackTraverse(SeqStack S); //栈的遍历
  • 0> 初始化
Status InitStack(SeqStack &S){
    S.base = new DataType [MAXSIZE_STACK];
    if(S.base==NULL){
        exit(OVERFLOW);
    }
    S.top = S.base;
    S.stackSize = MAXSIZE_STACK; // 设置栈的可用最大容量
    return OK;
}
  • 1> 入栈
Status Push(SeqStack &S, DataType e){//入栈
    if(S.top - S.base == S.stackSize){ // 栈满
        return ERROR;
    }
    *S.top = e;
    S.top++;
    StackTraverse(S);
    return OK;
}
  • 2> 出栈
Status Pop(SeqStack &S, DataType &e){//出栈
    if(S.top==S.base){//栈空
        return ERROR;
    }
    e = *(S.top-1); //返回栈顶元素的值 【易错】top所指处系栈顶元素的后一位,而非直接指向栈顶元素
    S.top--; //【易混】要么,是先自减1,再取栈顶元素(*(S.top-1)),最后降top的位置(top--);要么,先自降top位置(top-1),再直接取当前栈顶top位置的元素(即 S.top即为栈顶元素真值)
    return OK;
}
  • 3> 判定栈空
bool StackEmpty(SeqStack S){ // 栈空?
    if(S.base==S.top){ // 栈空
        return true;
    }
    return false; //栈不为空
}
  • 3> 判定栈满
bool StackFull(SeqStack S){ //栈满?
    if(S.top-S.base == S.stackSize){
        return true;//栈满
    }
    return false; //栈未满
}
  • 4> 取栈顶元素
Status GetTop(SeqStack S, DataType &e){//取栈顶元素
    if(S.top==S.base){//栈空
        return ERROR;
    }
    e = *(S.top-1); //【易错】
    return OK;
}
  • 5> 栈的长度
int StackLength(SeqStack &S){
    if(S.base==NULL){
        return -1;
    }
    return S.top-S.base;
}
  • 6> 栈的遍历
Status StackTraverse(SeqStack S){//遍历
    if(S.base == NULL){ // 栈结构不存在
        return ERROR;
    }
    if(S.base == S.top){//栈空
        return ERROR;
    }
    DataType *p = S.top;
    while(p!=S.base){
        cout<<p<<"\t";
        p--;
    }
    cout<<p<<endl;
    return OK;
}
  • 7> 执行:Main函数
#include<stdio.h>
#include<iostream>

#include"base.h" // 引入 基本数据类型 以及 表函数处理结果的状态码结构体 Status
#include<string> // main函数中需要测试调用 (string类)

using namespace std;

int main(){
    SeqStack S;
    InitStack(S);
    string instruction="-"; // string 在 cmd | 标准I/O 模式中输入时,将会以空格隔断字符串
    DataType data;
    cout<<"Please Input Your Instructions:"<<endl;
    cout<"Format: \n1.\"#\":Stop Execute.\n2.\"PUSH\" 'H':Push a element 'H'. 3.\"POP\" 'T':Pop a element 'T'.\n";
    while(instruction!= "#"){
        cout<<"[INSTRUCTION]";
        cin>>instruction;
        if(instruction=="PUSH"){
            if(!StackFull(S)){
                cout<<"[PUSH DATA]";
                cin>>data;
                //cout<<"(data:"<<data<<")\n"; //for test
                Push(S, data);
            } else {
                cout<<"<ERROR: Stack is full!So, it doesn't allow 'PUSH' operation!>"<<endl;
            }
        } else if(instruction=="POP"){
            Status status = Pop(S, data);
            if(status==OK){
                cout<<"[POP DATA]"<<data<<endl;
            } else {
                cout<<"<ERROR: 'POP' operation handle error!>"<<endl;
            }
        } else {
            cout<<"<ERROR: INSTRUCTION is error!)>"<<endl;
        }
            cout<<"(length:"<<StackLength(S)<<")\n";// for test
    }
    StackTraverse(S);
    return 0;
}
  • 8> Output For Test
Please Input Your Instructions:
[INSTRUCTION]PUSH
[PUSH DATA]8
(length:1)
[INSTRUCTION]PUSH
[PUSH DATA]7
(length:2)
[INSTRUCTION]PUSH
[PUSH DATA]3
(length:3)
[INSTRUCTION]PUSH
[PUSH DATA]1
(length:4)
[INSTRUCTION]PUSH
[PUSH DATA]K
(length:5)
[INSTRUCTION]PUSH
[PUSH DATA]M
(length:6)
[INSTRUCTION]POP
[POP DATA]M
(length:5)
[INSTRUCTION]%
<ERROR: INSTRUCTION is error!)>
(length:5)
[INSTRUCTION]#
<ERROR: INSTRUCTION is error!)>
(length:5)
M       KM      1KM     31KM    731KM   8731KM

参考文献

  • 《数据结构(C语言版/ 严蔚敏 李冬梅 吴伟民 编)》

原文地址:https://www.cnblogs.com/johnnyzen/p/11616849.html

时间: 2024-12-16 05:09:40

[C++]数据结构:栈之顺序栈的相关文章

Java数据结构-线性表之栈(顺序栈和链栈)

栈的定义:(特殊的线性表) ??仅在表的一端进行插入和删除的线性表.允许插入.删除的这一端称为栈顶,另一端称为栈底.表中没有元素时称为空栈. ??被称为后进先出的线性表(Last In First Out),简称 LIFO表,或被称为先进后出的线性表(First In Last Out),简称 FILO表. ??栈更具存储方式的不同分为两种:顺序栈和链栈. 顺序栈: 和顺序表一样,顺序栈也采用数组来存放数据元素: 为了保证栈底位置的不变,采用数组下标为0的位置作为顺序栈的栈底. 而栈顶指针的最大

12. C#数据结构与算法 -- 顺序栈

理论基础: 栈(Stack)是操作限定在表的尾端进行的线性表.表尾由于要进行插入.删除等操作,所以,它具有特殊的含义,把表尾称为栈顶(Top),另一端是固定的,叫栈底(Bottom).当栈中没有数据元素时叫空栈(Empty Stack). 栈可以分为顺序栈和链栈. 用一片连续的存储空间来存储栈中的数据元素,这样的栈称为顺序栈(Sequence Stack).类似于顺序表,用一维数组来存放顺序栈中的数据元素.栈顶指示器top设在数组下标为0的端,top随着插入和删除而变化,当栈为空时,top=-1

数据结构:C_顺序栈的实现

数据结构顺序栈的实现(C语言版) 1.写在前面 栈是一种遵循元素先进(Push)后出(Pop)规则的线性表,它的实现可以用数组或者链表. ..... 2.代码分解 2.1对栈的结构定义: typedef struct { int *base; int *top; int stacksize; }SqStack; |说明: 1.base表示栈底指针,在判断出栈.初始化和重新分配空间的时候需要用到. 2.top表示栈顶指针,是栈最关键和核心的组成,入栈时top向上移动,出栈时top向下移动. 3.此

数据结构C语言—顺序栈案例—十进制转二进制

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include "SeqStack.h" 4 5 void conversion(int); 6 SeqStack seq; 7 int main() 8 { 9 int n; 10 scanf("%d",&n); 11 conversion(n); 12 return 0; 13 } 14 15 void conversion(int N)

数据结构基础(6) --顺序栈的设计与实现

栈是一种只允许在一端进行插入或删除操作的线性表.其特点为:先进后出(FILO)/后进先出(LIFO); 栈 VS. 队列 栈和队列都是动态集合, 但在栈中, 可以去掉的是最近插入的那一个,:栈实现了一种后进先出(last-in, first-out)的策略;类似的, 在队列中, 可以去掉的元素总是在集合中存在时间最长的那一个:队列实现了先进先出(first-in, first-out)的策略[下一篇我们着重复习队列]. 栈的示意图: //顺序栈的实现与解析 template <typename

[数据结构]栈之顺序栈的类模板实现

栈的数组实现形式,采用动态分配数组,不够时可以调整栈的大小. Stack.h文件:主要定义栈的抽象基类,提供公共的接口函数. #ifndef STACK #define STACK //栈的抽象基类 template<class T> class Stack { public: Stack(){} ~Stack(){} virtual void Push(const T& x)=0; virtual bool Pop(T& x)=0; virtual bool getTop(T

数据结构笔记1顺序栈

#include<stdio.h> #include<conio.h>#include<stdlib.h>#define MAX 100typedef struct{ int data[MAX]; int top;}Stack;Stack s;//初始化 成功1int InitStack(Stack s){ s.top=-1; return 1;}//判空 非空1int StackEmpty(Stack s){ if(-1==s.top)  return 0; retu

数据结构与算法——顺序栈

今天总结栈的顺序存储结构 什么是栈? 栈是一种线性表,其特点是限定尽在表尾进行插入和删除操作,表尾栈一段也叫栈顶,另一端就是栈底了.既然栈是线性表,那么栈也就有两种存储数据的方式,顺序存储和链式存储.今天实现的是顺序存储的栈,也就顺序栈. 图示(来自百度图片): 顺序栈的实现: 栈的顺序存储还是比较简单的,就是对数组进行操作. <span style="font-family:Courier New;font-size:14px;">#include <iostrea

Java栈之顺序栈存储结构实现

一.栈的基本定义 栈是一种数据结构,它代表一种特殊的线性表,这种线性表只能在固定一端(通常认为是线性表的尾端)进行插入.删除操作的特殊线性表,通常就是在线性表的尾端进行插入.删除操作. 二.顺序栈的实现 顺序栈是利用一组地址连续的存储单元依次存放从栈底到栈顶的数据元素,栈底位置固定不变,它的栈顶元素可以直接通过顺序栈底层数组的数组元素arr[size - 1]来访问. 1 package com.ietree.basic.datastructure.stack; 2 3 import java.