数据结构之 简单栈的创建

来源:互联网 发布:js websocket 编辑:程序博客网 时间:2024/05/29 14:22

顺序栈

#include "stdafx.h"#include<iostream>using namespace std;typedef int SElemType;typedef struct{    SElemType *base;    int top;    int stacksize;}Stack;bool initStack(Stack&stack,int size){    stack.base= new SElemType[size];    if(!stack.base)        return 0;    stack.stacksize=size;    stack.top=0;    return 1;}bool Push(Stack&stack, SElemType str){    if(stack.top>=stack.stacksize)        return 0;    stack.base[++stack.top]=str;    return 1;}bool Pop(Stack&stack,SElemType& e){    if(stack.top<=0)    {        stack.top=0;        return 0;    }    e=stack.base[stack.top];    stack.top--;    return 1;}void freeStack(Stack&stack){    delete[] stack.base;}SElemType TopStack(Stack&stack){    return stack.base[stack.top];}int main(int argc, char* argv[]){      Stack stack;   initStack(stack,50);   for(int i=0;i<49;i++)//测试入栈   {       Push(stack,i);   }    cout<<TopStack(stack)<<endl;    for(int j=0;j<2;j++)//测试出栈   {       SElemType e;       Pop(stack,e);   }    cout<<TopStack(stack)<<endl;    freeStack(stack);    return 0;}

顺序栈解释:说白了就是开一个动态数组,进栈就是向里添加数据,数组角标由小到大递增,而出栈就是将添加了的最大角标递减,so Easy!栈有很多应用 如:编译,匹配括号,走迷宫等等

链式栈

#include "stdafx.h"#include <stdio.h>#include<iostream.h>template<typename T> class Stack{    public:        Stack<T>();        ~Stack<T>();        void Push(const T&);        T Pop();        void clear();        T GetTopData() const;    private:        typedef struct nodeStack{            T data;            nodeStack *last;        }*LinkStack;        LinkStack _linkStack;};int main(int argc, char* argv[]){    Stack<char*> stack;    stack.Push("栈1");    cout<<"入栈"<<endl;   cout<<"入栈后栈顶:"<<stack.GetTopData()<<endl;   stack.Push("栈2");   cout<<"入栈"<<endl;   cout<<"入栈后栈顶:"<<stack.GetTopData()<<endl;   stack.Push("栈3");   cout<<"入栈"<<endl;   cout<<"入栈后栈顶:"<<stack.GetTopData()<<endl;   stack.Push("栈4");   cout<<"入栈"<<endl;   cout<<"入栈后栈顶:"<<stack.GetTopData()<<endl<<endl;   char *c=stack.Pop();   cout<<"出栈"<<endl;   cout<<"出栈后栈顶:"<<stack.GetTopData()<<"  上次出栈的值:"<<c<<endl;   c= stack.Pop();   cout<<"出栈"<<endl;   cout<<"出栈后栈顶:"<<stack.GetTopData()<<"  上次出栈的值:"<<c<<endl;    return 0;}template<typename T> Stack<T>::Stack(){    _linkStack=new nodeStack();    _linkStack->last=NULL;    _linkStack->data=(T)NULL;}template<typename T> Stack<T>::~Stack(){    clear();}template<typename T> void Stack<T>::Push(const T&t) {    LinkStack ls=new nodeStack;    ls->last=_linkStack;    ls->data=t;    _linkStack=ls;}template<typename T> T Stack<T>::Pop(){    T t=NULL;    if(_linkStack)    {        LinkStack ls;        ls=_linkStack->last;        if(!ls)//如果是底栈         return (T)NULL;        t=_linkStack->data;//输出当前出栈数据        delete _linkStack; //删除当前栈              _linkStack=ls; //把前一个栈指针指向当前栈    }    return t;}template<typename T> void Stack<T>::clear(){    while(_linkStack)    {        Pop();    }}template<typename T> T Stack<T>::GetTopData() const{    if(!_linkStack)    return (T)NULL;    return (T)_linkStack->data;}

输出:
这里写图片描述

链式栈原理就是一个单向链表!写这个东西还是有用的,让我又复习数据结构教材,同时也复习了模板的应用~

更多文章:http://blog.csdn.net/what951006?viewmode=list

powered by:小乌龟在大乌龟背上~

0 0