堆栈(链栈)

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

#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef char SElemType;

typedef struct StackNode{
    SElemType data;
    struct StackNode *next;
}StackNode,*LinkStack;

//链栈的初始化
Status InitStack(LinkStack &S){
    S=NULL;
    return OK;
}

//链栈的入栈
Status Push(LinkStack &S,SElemType e){
    LinkStack p;
    p=new StackNode;//生成新结点
    p->data=e;//将新节点数据域置为e
    p->next=S;//将新结点插入栈顶
    S=p;//修改栈顶指针为p
    return OK;
}

//链栈的出栈
Status Pop(LinkStack &S,SElemType &e){
    LinkStack p;
    if(S==NULL)return ERROR;//栈空
    e=S->data;
    p=S;
    S=S->next;//修改栈顶指针
    delete p;//释放原栈顶元素的空间
    return OK;
}
//取链栈的栈顶元素
SElemType GetTop(LinkStack S){
    if(S!=NULL)//栈非空
    return S->data;
}

int main(){
    LinkStack s;
    int choose,flag=0;
    SElemType j,t;
    cout<<" 1.初始化\n ";
    cout<<" 2.入栈\n ";
    cout<<" 3.读栈顶元素\n ";
    cout<<" 4.出栈\n ";
    cout<<" 0.退出\n\n ";
    choose=-1;
    while(choose!=0){
        cout<<" 请选择: ";
        cin>>choose;
        switch(choose){
            case 1:
            if(InitStack(s)){
                flag=1;
                cout<<" 成功对栈进行初始化\n\n ";
            }else
                cout<<" 初始化栈失败\n\n ";
                break;
            case 2:{
                fstream file;
                file.open("SqStack.txt");
                if(!file){
                    cout<<" 错误 为找到文件!\n\n "<<endl;
                    flag=0;
                    exit(ERROR);
                }
                if(flag){
                    flag=1;
                    cout<<" 进栈元素依次为: \n ";
                    while(!file.eof()){
                        file>>j;
                        if(file.fail())break;
                        else{
                            Push(s,j);
                            cout<<j<<" ";
                        }
                    }
                    cout<<endl<<endl;
                }else cout <<" 栈未建立,请重新选择 \n\n ";
                file.close();
            }
            break;
            case 3:
            if(flag!=-1 && flag!=0)
                cout<<" 栈顶元素为 : \n"<<GetTop(s)<<endl<<endl;
            else cout<<" 栈中无元素,请重新选择\n" <<endl;
            break;
            case 4:
            if(flag==1){
                flag=0;
                cout<<" 依次弹出的栈顶元素为:\n ";
                while(Pop(s,t))
                    cout<<t<<" ";
                    cout<<endl<<endl;
            }else cout <<" 栈未建立,请重新选择\n\n";
            break;

        }
    }

    return 0;
}
时间: 2024-07-31 14:33:19

堆栈(链栈)的相关文章

堆、堆栈、栈

堆和栈的区别 (转贴) 非本人作也!因非常经典,所以收归旗下,与众人阅之!原作者不祥! 堆和栈的区别一.预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.2.堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵.3.全局区(静态区)(static)—,全局变量

链栈的实现

链栈即链式栈,也就是说我们不用再考虑空间的大小,可随心所欲的进行数据的插入/删除了.和顺序栈一样,仍然要保持其stack的特性,只在一端进行插入和删除,后进先出. 示例代码: #ifndef _LINKSTACK_H #define _LINKSTACK_H typedef int ElemType; typedef int Status; typedef struct linkStack { ElemType data; struct linkStack * top; }linkStack;

链栈和链队列的类实现

#include<iostream>#include<cassert> using namespace std; template <class T>//链栈 struct LinkNode{T data;LinkNode<T> *Link;LinkNode(LinkNode<T> *pr=NULL){Link=pr;}LinkNode(const T& item,LinkNode<T> *pr=NULL){data=item

数据结构(java语言描述)链栈的定义

1.定义栈接口 package stack;public interface Istack {    public void clear();    public boolean isEmpty();    public int length();    public Object peek();    public void push(Object x) throws Exception;    public Object pop();} 2.定义Node结点 package stack; i

链栈-书上习题

元素的入栈出栈 链栈: 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 struct stack 5 { 6 char data; 7 stack *next; 8 }; 9 stack* initstack() /*为栈头指针申请内存*/ 10 { 11 stack *s=new stack; 12 s->next=NULL; 13 return s; 14 } 15 int isempt

java实现链栈

前面学习了java实现顺序栈:http://www.cnblogs.com/lixiaolun/p/4644134.html 接下来,学习java实现链栈. 链栈类代码: package linkedstack; public class LinkStack { private Element base; private Element top; class Element { public Object data; public Element next; } /** * 初始化栈 * */

数据结构(C实现)------- 链栈

描述:      链栈,即栈的链式存储结构,链栈通常使用不带头结点的单链表来表示,因此其结点的结构和单链表的结点结构相同. 在一个链栈中,栈底就是链表的最后一个结点,而栈顶总是链表的第一个结点.因此,新入栈的元素即为链表中采用头插法新加入的结点,一个链栈可以由栈顶指针唯一确定,当top为NULL时,则表示该栈是一个空的链栈.  实现:   链栈结点的类型描述: typedef int ElemType; typedef struct node{ ElemType data; struct nod

栈的Java实现--链栈

栈的Java实现--链栈 链栈,顾名思义,就是以链表的形式实现的栈的相关操作,其实是功能弱化了的链表,如果已经阅读过链表的实现代码,那么链栈的实现显得更为容易. 链栈的基本结构: 链栈的入栈操作: 让top引用指向新的节点,新节点的next指向原来的top 记录栈内元素个数的size+1 链栈的出栈操作: top引用指向原栈顶元素的下一个元素(top.next),并释放原栈顶元素的引用 记录栈内元素个数的size-1 链栈的Java实现代码: package com.liuhao.DataStr

【小白成长撸】--链栈(C语言版)

1 // 链栈.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include <stdio.h> 6 #include <stdlib.h>//malloc的头文件 7 8 typedef struct line_stack//栈包装 9 { 10 int x; 11 struct line_stack *next; 12 }link; 13 14 void pushes(link **top, int