码迷,mamicode.com
首页 > 其他好文 > 详细

顺序栈

时间:2014-08-07 22:53:35      阅读:325      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   os   io   strong   数据   for   

  是限定尽在表尾进行插入或者删除操作的线性表,分为顺序栈链式栈

  对于malloc()一次申请的内存地址,在逻辑上是连续的,也就是我们用的时候可以当做连续的来用,但是在物理内存上未必是连续的;

  顺序栈:

    利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设top指示栈顶元素在顺序栈中的位置,top永远指向栈顶元素的下一个元素位置,下面我们来看         一下顺序栈的基本操作和其应用如下:

      链式栈:

    由单链表来实现,具体操作是在头指针head的后面进行插入或者删除操作;

  顺序栈和链式栈比较

    顺序栈需要固定空间长度,存在溢出问题,而链式栈不存在;

    链式栈的每个元素都有指针域,增加了空间开销,并且求栈长度时候时间复杂度为O(n),也就是遍历整个链;

#include <iostream>
using namespace std;

#define  STACK_INIT_SIZE 100
#define  STACKINCREMRNT 10
struct Stack
{
    int *base;
    int *top;
    int stacksize;
};
bool InitStack(Stack &s)
{
    s.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));// 分配内存
    if (!s.base)//detect 
    {
        exit(OVERFLOW);
    }
    s.top=s.base;//empty stack
    s.stacksize=STACK_INIT_SIZE;//init stacksize
    return true;
}
bool StackPush(Stack &s,int e)//
{
    if (s.top-s.base>=s.stacksize)//very important, s.top, s.base and s.stacksize all changed
    {
        s.base=(int*)realloc(s.base,(s.stacksize+STACKINCREMRNT)*sizeof(int));
        if (!s.base)
        {
            exit(OVERFLOW);
        }
        s.top=s.base+s.stacksize;
        s.stacksize+=STACKINCREMRNT;
    }
    *s.top=e;
    s.top++;
    return true;
}

bool GetTop(Stack &s,int &e)
{
    if (s.top==s.base)
    {
        return false;
    }
    else
        e=*(s.top-1);
    return true;
}

bool StackPop(Stack &s, int &e)
{
    if (s.base==s.top)
    {
        return 0;
    }
    else
    {
        s.top--;
        e=*s.top;
    }
    return true;
}

bool StackEmpty(Stack &s)
{
    if (s.base==s.top)
    {
        return true;
    }
    else
        return false;

}
void main()
{
    Stack s={0};
    bool stats=InitStack(s);
    if (stats)
    {
        cout<<"initial stack success!"<<endl;
    }
    else
        cout<<"initial stack error!";
    int pushnum=0,pushnum2=0;
    cout<<"please input the number:";
    cin>>pushnum;
    StackPush(s,pushnum);
    cout<<"please input the number:";
    cin>>pushnum2;
    StackPush(s,pushnum2);
    int popnum=0;
    StackPop(s,popnum);
    StackPop(s,popnum);
    cout<<"the popnum is:"<<popnum<<endl;
    int topnum=0;
    if (GetTop(s,topnum))
    {
        cout<<topnum<<endl;
    }
    else
    {
        cout<<"the stack is empty"<<endl;
    }
}

//顺序栈应用  由十进制转换为8进制数
void Convers8()
{
    int num;
    Stack s={0};
    InitStack(s);
    cout<<"please input the 10 number:";
    cin>>num;
    while (num)
    {
        StackPush(s,num%8);
        num/=8;
    }
    int num8;
    while(!StackEmpty(s))
    {
        StackPop(s,num8);
        cout<<num8;
    }
}
void main()
{
    Convers8();
    cout<<endl;
}

 

下面是链式栈的基本操作

#include <iostream>
using namespace std;
//栈的链式存储结构
//栈顶指针为链表的头结点
//插入元素要在头结点后面插入

struct ChainStack
{
    ChainStack * next;
    int data;
};

ChainStack *InitStack()
{
    ChainStack*    head=(ChainStack*)malloc(sizeof(ChainStack));
    head->next=NULL;
    return head;
}

void PushStack(ChainStack *head,int num)//在头结点后插入
{
    ChainStack *p=(ChainStack*)malloc(sizeof(ChainStack));
    p->data=num;
    p->next=head->next;
    head->next=p;
}
bool PopStack(ChainStack *head,int &num)
{
    
    if (head->next==NULL)
    {
        cout<<"the stack is empty"<<endl;
        return false;
    }
    else
        {
            ChainStack *p=head->next;
            num=p->data;
            head->next=p->next;
            free(p);//别忘了释放内存
        }
    return true;
}

void main()
{
    ChainStack*s=NULL;
    s=InitStack();
    int pushnum=0;
    cout<<"请输入栈区总长度:";
    int leng;
    cin>>leng;
    for (int i=0;i<leng;i++)
    {
        cout<<"please input the "<<i+1<<" number: ";
        cin>>pushnum;
        PushStack(s,pushnum);
    }
    int popnum=0;
    for ( ;PopStack(s,popnum); )
    {
        cout<<"the pop num is "<<popnum<<endl;
    }
}

 

    

顺序栈,布布扣,bubuko.com

顺序栈

标签:style   blog   color   os   io   strong   数据   for   

原文地址:http://www.cnblogs.com/mu-tou-man/p/3898076.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!