栈实验

node.h

#ifndef __NODE_H__
#define __NODE_H__

// 结点类模板
template <class ElemType>
struct Node
{
// 数据成员:
    ElemType data;            // 数据域
    Node<ElemType> *next;        // 指针域
};
#endif

lk_stack.h

#ifndef __LINK_STACK_H__
#define __LINK_STACK_H__
#include "node.h"
#include <iostream>
using namespace std;
template<class ElemType>
class LinkStack
{
    private:
        Node<ElemType> *top;    // 栈顶指针
        int count;     //栈长度
    public:
        LinkStack( );
        virtual ~LinkStack( );
        void  Clear( );
         bool  Empty( );
        int  Length( );
        bool Push(ElemType e); //新元素入栈
        bool Pop(ElemType &e); //出栈,即删除栈顶元素
        bool Top(ElemType &e); //读栈,即读取栈顶元素
        void Traverse( );
        //void SysConvert();
};

template<class ElemType>
LinkStack<ElemType>::LinkStack(){
    top = NULL;
    count=0;
    return;
}

template <class ElemType>
LinkStack<ElemType>:: ~LinkStack( ){
    Clear();
}

template<class ElemType>
void LinkStack<ElemType>::Clear(){
    Node<ElemType> *p;
    while(top!=NULL){
        p=top;
        top=top->next;
        delete p;
    }
    count=0;
}

template<class ElemType>
bool LinkStack<ElemType>::Empty(){
    return top == NULL;
}

template <class ElemType>
int LinkStack<ElemType>::Length(){
    return count;
}

template<class ElemType>
bool LinkStack<ElemType>::Push(ElemType e){
    Node<ElemType> *newtop = new Node<ElemType>;
    newtop->data = e;
    newtop->next = top;
    top = newtop;
    count++;
    return true;

}

template<class ElemType>
bool LinkStack<ElemType>::Pop(ElemType &e) {
    if (Empty()){
        return false;
    }else{
        Node<ElemType> *old_top = top;
        e = old_top->data;
        top = old_top->next;
        delete old_top;    count--;
        return true;
    }
}

template<class ElemType>
bool LinkStack<ElemType>::Top(ElemType &e){
    if(Empty()){
        return false;
    }else{
        e = top->data;
        return true;
    }
}

template <class ElemType>
void LinkStack<ElemType>::Traverse( ) {
    Node<ElemType> *tmpPtr;
    for (tmpPtr = top; tmpPtr != NULL; tmpPtr = tmpPtr->next){
        cout<<tmpPtr->data<<‘\t‘;
    }
}

#endif

sq_stack.h

#ifndef __SQ_STACK_H__
#define __SQ_STACK_H__

#include "node.h"
#include <iostream>
using namespace std;

template <class ElemType>
class SqStack{
    private:
        int count;
        int maxSize;
        ElemType *elems;
    public:
        SqStack( int  size);  //size为栈的长度
        virtual ~SqStack( );
        void  Clear( );
        bool  Empty( );
        int  Length( );
        bool Full();
        bool Push(ElemType e); //新元素入栈
        bool Pop(ElemType &e); //出栈,即删除栈顶元素
        bool Top(ElemType &e); //读栈,即读取栈顶元素
        void Traverse( );

};

template <class ElemType>
SqStack<ElemType>::SqStack(int size){
    elems = new ElemType[maxSize];
    if(elems == NULL){
        cout << "init error.";
        return;
    }
    maxSize = size;
    count = 0;
    return;
}

template <class ElemType>
SqStack<ElemType>::~SqStack(){
    delete []elems;
    maxSize = 0;
    count = 0;
    return;
} 

 template <class ElemType>
 void SqStack<ElemType>::Clear(){
     count = 0;
     return;
 }

template <class ElemType>
bool SqStack<ElemType>::Empty(){

    return count == 0;
}

template <class ElemType>
bool SqStack<ElemType>::Full(){
    return count == maxSize;
}

template <class ElemType>
int SqStack<ElemType>::Length(){
    return count;
}

template <class ElemType>
bool SqStack<ElemType>::Push(ElemType e){
    if(Full()){
        cout << "fulled";
        return false;
    }else{
        elems[count] = e;
        ++count;
        return true;
    }
    return false;
}

template <class ElemType>
bool SqStack<ElemType>::Pop(ElemType &e){
    if(Empty()){
        return false;
    }else{
        e = elems[count - 1];
        --count;
        return true;
    }
    return false;
}

template <class ElemType>
bool SqStack<ElemType>::Top(ElemType &e){
    if(Empty()){
        cout << "Empty";
        return false;
    }else{
        e = elems[count-1];

    }
    return true;
}

template <class ElemType>
void SqStack<ElemType>::Traverse(){
    for(int i = 1; i <= count; ++i){
        cout << elems[i-1];
    }
    return;
}
#endif

main.cpp

#include "lk_stack.h"        // 

#include "sq_stack.h"
#define ElemType int
#define DEFAULT_SIZE 3
//#include <iostream>
//using namespace std;
int main(void){
    LinkStack<ElemType> l;
    SqStack<ElemType> s(DEFAULT_SIZE);
    int c = 0;
    while(c != 100){
        cout << "\n1. 链式栈入栈.";
        cout << "\n2. 链式栈遍历.";
        cout << "\n3. 链式栈出栈.";
        cout << "\n4. 链式栈读栈.";
        cout << "\n5. 链式栈清空.";
        cout << "\n6. 链式栈销毁.";
        cout << "\n7. 顺序栈入栈.";
        cout << "\n8. 顺序栈出栈.";
        cout << "\n9. 顺序栈销毁.";
        cout << "\n10. 顺序栈清空.";
        cout << "\n11. 顺序栈读栈.";
        cout << "\n12. 顺序栈判断是否为空.";
        cout << "\n13. 顺序栈求长.";
        cout << "\n14. 顺序栈遍历.";
        cout << "\n15. SysConvert.";//进制转换,基于LinkStack.h
        cout << "\n16. .";
        cout << "\n17. .";
        cin >> c;
        switch(c){
            case 1:
                ElemType i;
                cout << "input element: ";
                cin >> i;
                l.Push(i);
                break;
            case 2:
                l.Traverse();
                break;
            case 3:
                ElemType j;
                l.Pop(j);
                break;
            case 4:
                ElemType e;
                l.Top(e);
                break;
            case 5:
                l.Clear();
                break;
            case 6:
                l.~LinkStack();
                break;
            case 9:
                s.~SqStack();
                break;
            case 10:
                s.Clear();
                break;
            case 12:
                if(s.Empty()){
                    cout << "is emp";
                }else{
                    cout << "not emp";
                }
                break;
            case 13:
                cout << s.Length();
                break;
            case 7:
                ElemType p;
                cout << "input element:";
                cin >> p;
                s.Push(p);
                break;
            case 8:
                ElemType pop;
                s.Pop(pop);
                cout << "poped " << pop;
                break;
            case 11:
                ElemType top;
                s.Top(top);
                break;
            case 14:
                s.Traverse();
                break;
            case 15:
                break;
            case 16:
                break;
        }
    }
    return 0;
}
时间: 2024-08-24 05:46:24

栈实验的相关文章

IPv6技术系列⑨——IPv6、IPv4双栈实验

一.技术简介 双协议栈是指在单个节点同时支持IPv4和IPv6两种协议栈.由于IPv6和IPv4是功能相近的网络层协议, 两者都基于相同的物理平台, 而且加载于其上的传输层协议TCP和UDP也基本没有区别, 因此, 支持双协议栈的节点既能与支持IPv4协议的节点通信, 又能与支持IPv6协议的节点通信.而此种技术,也作为IPv4向IPv6过渡的技术之一广泛存在于现网之中. 二.实验拓扑 三.实验步骤 1.按照图中网络分配方法分别设置路由器Router0.Router1.Router2中各接口的I

汪大神Java多线程编程实战

课程目录:├─1│  ├─Java并发编程.png│  ├─源码+ppt.rar│  ├─高并发编程第一阶段01讲.课程大纲及主要内容介绍.wmv│  ├─高并发编程第一阶段02讲.简单介绍什么是线程.wmv│  ├─高并发编程第一阶段03讲.创建并启动线程.mp4│  ├─高并发编程第一阶段04讲.线程生命周期以及start方法源码剖析.mp4│  ├─高并发编程第一阶段05讲.采用多线程方式模拟银行排队叫号.mp4│  ├─高并发编程第一阶段06讲.用Runnable接口将线程的逻辑执行单元

七方件业金离以提领前群约会ODjdidtlwfWv

为了从不同环节,尤其与广大使用人群直接关系的环节反映质量状况,对共享自行车投放点.运营仓库.生产企业等不同环节的产品抽查,覆盖了共享自行车从成品出厂到待投放的关键环节. 该负责人称,根据新车投放情况,结合共享自行车行业市场占有分布特点,本次重点抽查了摩拜.ofo.Hellobike三个品牌的产品,占本次抽查批次总数的83.3%.其中,在天津.无锡.武汉.广州.深圳.东莞6个城市抽查了9批次摩拜产品,占产品抽查批次总数的37.5%,抽查批次合格率88.9%,抽查不合格的1批次产品为待投放于广州市的

数据结构实验之栈:进制转换

            数据结构实验之栈:进制转换 输入一个十进制整数,将其转换成对应的R(2<=R<=9)进制数,并输出. 输入 第一行输入需要转换的十进制数:第二行输入R. 输出 输出转换所得的R进制数. 模板: while(n!=0) { mod = n%r; q[i++] = mod;//i初始化为0 n/=r; }  

数据结构实验之栈:行编辑器

数据结构实验之栈:行编辑器 题目描述 一个简单的行编辑程序的功能是:接受用户从终端输入的程序或数据,并存入用户的数据区. 由于用户在终端上进行输入时,不能保证不出差错,因此,若在编辑程序中,“每接受一个字符即存入用户数据区”的做法显然不是最恰当的.较好的做 法是,设立一个输入缓冲区,用以接受用户输入的一行字符,然后逐行存入用户数据区.允许用户输入出差错,并在发现有误时可以及时更正.例如,当用户发现刚 刚键入的一个字符是错的时,可补进一个退格符"#",以表示前一个字符无效: 如果发现当前

SDUT OJ 1479 数据结构实验之栈:行编辑器

数据结构实验之栈:行编辑器 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 一个简单的行编辑程序的功能是:接受用户从终端输入的程序或数据,并存入用户的数据区. 由于用户在终端上进行输入时,不能保证不出差错,因此,若在编辑程序中,“每接受一个字符即存入用户数据区”的做法显然不是最恰当的.较好的做 法是,设立一个输入缓冲区,用以接受用户输入的一行字符,然后逐行存入用户数据区.允许用户输入出差错,并在发现有误时可以及时更正.例如,当

数据结构实验之栈三:后缀式求值

数据结构实验之栈三:后缀式求值 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 对于一个基于二元运算符的后缀表示式(基本操作数都是一位正整数),求其代表的算术表达式的值. 输入 输入一个算术表达式的后缀式字符串,以'#'作为结束标志. 输出 求该后缀式所对应的算术表达式的值,并输出之. 示例输入 59*684/-3*+# 示例输出 57 提示 基本操作数都是一位正整数! 来源 示例程序 #include <stdio.h>

数据结构实验之栈二:一般算术表达式转换成后缀式

数据结构实验之栈二:一般算术表达式转换成后缀式 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之. 输入 输入一个算术表达式,以'#'字符作为结束标志. 输出 输出该表达式转换所得到的后缀式. 示例输入 a*b+(c-d/e)*f# 示例输出 ab*cde/-f*+ 提示 来源 示例程序 由一般是求后缀式: 1.设立暂时存放运算符的栈: 2.设表达式的结束符为"#

数据结构实验之栈一:进制转换(栈的应用)

 数据结构实验之栈一:进制转换 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 输入一个十进制整数,将其转换成对应的R(2<=R<=9)进制数,并输出. 输入 第一行输入需要转换的十进制数: 第二行输入R. 输出 输出转换所得的R进制数. 示例输入 1279 8 示例输出 2377 提示 来源 示例程序 后台数据太水,按理说应该考虑零的情况,但是你不判断零也是对的. #include <stdio.h> #i