栈基本操作(顺序栈)

#include<iostream>
#include<cstdlib>
using namespace std;

//定义初始化长度和每次增加的长度
const int STACK_INIT_SIZE=10;
const int STACK_INCREAMENT=2;

struct Stack{
    int* base;  //栈底
    int* top;   //栈顶
    int stacksize;  //已分配栈的大小
};

//函数声明
void show();//主界面
void InitStack(Stack &S);//初始化栈
void DestroyStack(Stack &S);//销毁栈
void ClearStack(Stack &S);//清空栈
int StackEmpty(Stack S);//判断栈是否为空
int StackLength(Stack S);//获取栈的长度
void GetTop(Stack S,int &e);//获取顶部元素
void Push(Stack &S,int e);//入栈
void Pop(Stack &S,int &e);//出栈
void StackVisit(Stack S);//从栈顶遍历栈

int main(){
    show();
    Stack s;
    int e,action;
    while(cin>>action){
        switch(action){
            case 1://初始化栈
                system("cls");
                InitStack(s);
                break;

            case 2://销毁栈
                system("cls");
                DestroyStack(s);
                break;

            case 3://清空栈
                system("cls");
                ClearStack(s);
                break;

            case 4://判断栈是否为空
                system("cls");
                StackEmpty(s);
                break;

            case 5://获取栈的长度
                system("cls");
                StackLength(s);
                break;

            case 6://获取顶部元素
                system("cls");
                GetTop(s,e);
                break;

            case 7://入栈
                system("cls");
                cout<<"please input the length you want to push"<<endl;
                int l;
                cin>>l;
                cout<<"please input the number you want to push"<<endl;
                for(int i=0;i<l;i++){
                    cin>>e;
                    Push(s,e);
                }
                break;

            case 8://出栈
                system("cls");
                Pop(s,e);
                break;

            case 9://从栈顶遍历栈
                system("cls");
                StackVisit(s);
                break;
        }
        system("pause");
        system("cls");
        show();
    }
    return 0;
}

//主界面
void show(){
    cout<<"+-------------------------------------------------+"<<endl;
    cout<<"|                                                 |"<<endl;
    cout<<"|        1 ->Initialized the stack                |"<<endl;
    cout<<"|        2 ->destroy the stack                    |"<<endl;
    cout<<"|        3 ->clear the stack                      |"<<endl;
    cout<<"|        4 ->whether the stack is empty           |"<<endl;
    cout<<"|        5 ->get the length                       |"<<endl;
    cout<<"|        6 ->get the top of stack                 |"<<endl;
    cout<<"|        7 ->push into the stack                  |"<<endl;
    cout<<"|        8 ->pop from the stack                   |"<<endl;
    cout<<"|        9 ->visit the stack                      |"<<endl;
    cout<<"|        10->quit                                 |"<<endl;
    cout<<"|                                                 |"<<endl;
    cout<<"+-------------------------------------------------+"<<endl;
}

//初始化栈
void InitStack(Stack &S){
    S.base=new int[STACK_INIT_SIZE];
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    cout<<"the stack has been initialized!"<<endl<<endl;
}

//销毁栈
void DestroyStack(Stack &S){
    delete S.base;
    cout<<"the stack has been destroyed"<<endl;
}

//清空栈
void ClearStack(Stack &S){
    S.top=S.base;
    cout<<"the stack has been cleared"<<endl;
}

//判断栈是否为空
int StackEmpty(Stack S){
    if(S.base==S.top){
        cout<<"the stack is empty!"<<endl;
        return 1;
    } else {
        cout<<"the stack is not empty!"<<endl;
        return 0;
    }
}

//获取栈的长度
int StackLength(Stack S){
    cout<<"the length of the stack is "<<S.top-S.base<<endl;
    return S.top-S.base;
}

//获取顶部元素
void GetTop(Stack S,int &e){
    if(S.top==S.base){
        cout<<"the stack is empty"<<endl;
    } else{
        e=*(S.top-1);
        cout<<"the top of the stack is "<<e<<endl;
    }
}

//入栈
void Push(Stack &S,int e){
    if(S.top-S.base>=S.stacksize){
        //在原有的空间上增加一段空间,用realloc(),具体使用方法请自行百度
        S.base=(int* )realloc(S.base,(S.stacksize+STACK_INCREAMENT)*sizeof(int));
        if(!S.base){
            cout<<"wrong!"<<endl;
        } else {
            S.top=S.base+S.stacksize;
            S.stacksize+=STACK_INCREAMENT;
        }
    }
    *(S.top++)=e;
    cout<<e<<" has been pushed into the stack"<<endl;
}

//出栈
void Pop(Stack &S,int &e){
    if(S.top==S.base){
        cout<<"the stack is empty"<<endl;
    } else {
        e=*--S.top;
        cout<<"the number has been poped,it‘s "<<e<<endl;
    }
}

//从栈顶遍历栈
void StackVisit(Stack S){
    int e;
    while(S.top>S.base){
        //方法一
        //cout<<*(--S.top)<<‘ ‘;

        //方法二
        Pop(S,e);
    }
}
时间: 2025-01-04 07:03:56

栈基本操作(顺序栈)的相关文章

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

0 栈的基本概念 栈,根据存储结构的不同,可分为:链栈和顺序栈. 1 顺序栈的知识概览 2 编程复现 2.1 定义基本数据结构 typedef char DataType; // 基本数据类型 enum Status { ERROR, OK, OVERFLOW };// 状态(码) : 枚举类型 #define MAXSIZE_STACK 100 //栈内最大元素数 typedef struct { // 顺序栈 DataType *base; // 栈底指针 (NULL:栈结构不存在:[重点]

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

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

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

栈的数组实现形式,采用动态分配数组,不够时可以调整栈的大小. 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

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

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

栈:顺序栈和链式堆栈

一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除操作. 先进后出:堆栈中允许进行插入和删除操作的一端称为栈顶,另一端称为栈底.堆栈的插入和删除操作通常称为进栈或入栈,堆栈的删除操作通常称为出栈或退栈. 备注:栈本身就是一个线性表,所以我们之前讨论过线性表的顺序存储和链式存储,对于栈来说,同样适用. 二.堆栈的抽象数据类型: 数据集合: 堆栈的数据

顺序栈-使用顺序栈实现十进制转换二进制

1 #include"stdio.h" 2 #define MaxSize 50 3 typedef int DataType; 4 typedef struct{ 5 DataType elem[MaxSize]; 6 int top; 7 }SeqStack; 8 void initStack(SeqStack &s) 9 { 10 s.top = -1; 11 } 12 int push(SeqStack &s , DataType x) 13 { 14 if(s

数据结构之栈(1)——顺序栈

栈作为一种特殊的线性表,在计算机中有顺序储存结构和链式存储结构两种存储结构,根据这个我们把栈分为顺序栈和链栈 顺序栈 栈顶:用top来动态地表示栈顶元素在顺序栈中的位置,当top=-1时表示栈为空 这个是栈这个数据类型的定义 typedef char ElemTypeStack; typedef struct{ ElemTypeStack elem[MAXSIZE]; int top; }FirStack; 用一个数组来存储数据,对应的下标表示他在栈中的位置,top表示栈顶元素对应的下标,若栈为

使用JAVA数组实现顺序栈

1,首先总结一下线性表(分为顺序表和链接表,[即顺序存储结构和链式存储结构的区别])和栈(顺序栈和链接栈)还有队列(顺序队列和链接队列)的JAVA类库中的实现: java.util.ArrayList 实现了顺序表,java.util.LinkedList 实现了链接表的功能. java.util.ArrayDeque实现了顺序栈和顺序队列(该类中即定义了与栈操作有关的方法,也定义了与队列操作有关的方法).java.util.LinkedList实现了链接栈和链接队列. 2,定义了一个Stack

顺序栈与链表栈的实现

栈是一种常见的数据结构,它虽然有栈顶和栈底之分,但它只能从一端操作(插入或删除),从而是一种"先进后出"的操作模式.向栈内进数据称为压栈(Push),从栈里取出数据叫出栈(POp).例如压栈顺序为1.2.3.4.5,着出栈的顺序为5.4.3.2.1(只考虑一次性出栈的情况). 栈按照存储的方式,又分为顺序栈和链表栈.顺序栈基于数组实现,所以顺序栈存储数据的内存是连续的,在创建栈时规定好栈的大小,这样对内存的使用效率并不高.而链式栈则是采用了链表来实现,其元素的存储地址是不连续的,而且是

数据结构第七篇——顺序栈

?注:未经博主同意,不得转载. 栈(stack)是常用的重要数据结构,其应用十分广泛.栈是一个操作受限的线性表,其插入和删除操作都在表的同一端进行. 其中允许操作的一端称为栈顶(top),另一端称为栈底(bottom),不含元素的栈称为空栈. 栈的修改是按后进先出的原则进行的,因此,栈称为后进先出表(Last In First Out,LIFO).称插入元素的操作为入栈(push),删除元素的操作为出栈(pop). 栈由元素列表.指向栈顶的下标或指针以及栈的操作集组成.栈的具体实现有两种方式:顺