C/C++ 数据结构之 栈的创建

顺序栈

#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:小乌龟在大乌龟背上~

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值