1. 程式人生 > >C/C++ 資料結構之 棧的建立

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;

}

輸出:
這裡寫圖片描述

鏈式棧原理就是一個單向連結串列!寫這個東西還是有用的,讓我又複習資料結構教材,同時也複習了模板的應用~

powered by:小烏龜在大烏龜背上~