順序棧與鏈表棧的實現

    棧是一種常見的數據結構,它雖然有棧頂和棧底之分,但它只能從一端操作(插入或刪除),從而是一種“先進後出”的操作模式。向棧內進數據稱爲壓棧(Push),從棧裏取出數據叫出棧(POp)。例如壓棧順序爲1、2、3、4、5,着出棧的順序爲5、4、3、2、1(只考慮一次性出棧的情況)。

    棧按照存儲的方式,又分爲順序棧和鏈表棧。順序棧基於數組實現,所以順序棧存儲數據的內存是連續的,在創建棧時規定好棧的大小,這樣對內存的使用效率並不高。而鏈式棧則是採用了鏈表來實現,其元素的存儲地址是不連續的,而且是動態分配內存。順序棧在使用的過程中可能出現 棧滿、棧空的情況,由於鏈式棧基於鏈表設計,因此不會有棧滿的情況(也會棧空)。

順序棧:

//順序棧
#include <stdio.h>
#define SIZE 10
typedef struct Stack
{
int data[SIZE];
int top;
}Stack;
//初始化棧
void init_stack(Stack* st)
{
st->top=-1;
}
//判斷棧是否爲空
int is_stack_empty(Stack* st)
{
if(st->top==-1)
return 1;
return 0;
}
//判斷棧是否爲滿
int is_stack_full(Stack* st)
{
if(st->top==SIZE-1)
{
return 1;
}
return 0;
}
//獲取棧頂值
int get_top_value(Stack* st)
{
if(is_stack_empty(st))
{
printf("stack is empty!\n");
return -1;
}
return st->data[st->top];
}
//進棧
void push(Stack* st,int _data)
{
if(is_stack_full(st))
{
printf("stack is full!\n");
return ;
}
st->top++;
st->data[st->top]=_data;
}
//出棧
int pop(Stack* st)
{
if(is_stack_empty(st))
{
printf("stack is empty!\n");
return -1;
}
return st->data[st->top--];
}
int main(int argc, char const *argv[])
{
Stack st;
    init_stack(&st);
    int i;
    for(i=0;i<10;i++)
    {
     push(&st,i);
    }
    push(&st,23);
    push(&st,23);
    printf("topvalue:%d\n",get_top_value(&st));
    for(i=0;i<12;i++)
    {
    printf("%d\n",pop(&st));
    }
   
return 0;
}

鏈式棧:

#include <stdio.h>
#include <stdlib.h>
//定義節點
typedef struct Node
{
int data;
struct Node* next;
}Node;
typedef struct Stack
{
Node* top;
}Stack;
//初始化棧
void init_stack(Stack* st)
{
st->top=NULL;
}
//判斷棧是否爲空
int is_stack_empty(Stack* st)
{
if(st->top==NULL)
{
return 1;
}
return 0;
}
//獲取棧頂值
int get_topvalue(Stack* st)
{
if(is_stack_empty(st))
{
printf("Stack is empty!\n");
return -1;
}
return st->top->data;
}
//進棧
void push(Stack* st,int _data)
{
Node* newnode=(Node*)malloc(1*sizeof(Node));
newnode->data=_data;
newnode->next=st->top;
st->top=newnode;
}
//出棧
int pop(Stack* st)
{
if(is_stack_empty(st))
{
printf("Stack is empty!\n");
return ;
}
Node* temp=st->top;
int retvalue=st->top->data;
st->top=st->top->next;
free(temp);
return retvalue;
}
int main(int argc, char const *argv[])
{
Stack st;
init_stack(&st);
int i;
for(i=0;i<16;i++)
{
push(&st,i+1);
}
printf("%d\n",get_topvalue(&st));
for(i=0;i<17;i++)
{
printf("%d\t",pop(&st));
}
printf("\n");
return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章