程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 一個簡單的C stack實現,stack實現

一個簡單的C stack實現,stack實現

編輯:關於C語言

一個簡單的C stack實現,stack實現


用C語言實現了一個簡單的棧。基本思路是定義一個棧結構體,裡面有兩個指針和一個表示棧大小的int。兩個指針分別指向棧底和棧頂,當棧底指針和棧頂指針重合時,說明棧為空;當棧頂指針減去棧底指針的值大於等於棧的大小,說明棧已滿。

//mystack.h
#ifndef mystack_H
#define mystack_H

#include <stdio.h>
#include <stdlib.h>

#define MYSTACK_INCREASE_NUM 2

typedef  int ElementType;                    //暫定為int
typedef int Bool;

typedef struct 
{
    ElementType * bottom;                    //棧底指針
    ElementType * top;                        //棧頂指針
    int size;                                //棧大小
} MyStack;    

MyStack * initStack( int size);                            //初始化
Bool freeStack(MyStack * stack);                        //釋放內存
Bool push(MyStack * stack, ElementType data);            
Bool pop(MyStack *stack, ElementType * outputData);
Bool isEmpty(MyStack *stack);
void makeStackEmpty(MyStack *stack);
void printStack(MyStack *stack);

#endif
//mystack。c
#include "mystack.h"

MyStack* initStack( int size)
{
    MyStack* stack = (MyStack*)malloc(sizeof(MyStack));                    //分配內存
    if(stack==NULL)
        return NULL;
    stack->bottom = (ElementType*)malloc(sizeof(ElementType)*size);
    if(stack->bottom == NULL)
        return NULL;
    stack->top = stack->bottom;                //初始化為空棧   棧頂指針和棧底指針指向同一位置
    stack->size = size;                        //初始化大小

    return stack;
}


Bool freeStack(MyStack * stack)
{
    if(stack!=NULL)
    {
        free(stack->bottom);
        free(stack);
        return 1;
    }
    else
    {
        return 0;
    }
}

void makeStackEmpty(MyStack *stack)
{
    if(stack!=NULL)
        stack->top = stack->bottom;
}

Bool isEmpty(MyStack *stack)
{
    if(stack != NULL)
    {
        if(stack->bottom == stack->top)
            return 1;
        else
            return 0;
    }
    else
        return 0;
}

Bool push(MyStack * stack, ElementType data)
{
    if(stack->top - stack->bottom >= stack->size)              //棧滿
    {
        stack->bottom = (ElementType*)realloc(stack->bottom,          //分配內存,增加棧大小
            sizeof(ElementType*)*(stack->size + MYSTACK_INCREASE_NUM));
        if(stack->bottom == NULL)
            return 0;
        stack->top = stack->bottom + stack->size;                //初始化棧頂指針
        stack->size += MYSTACK_INCREASE_NUM;
    }
    *(stack->top)=data;                        //先存值
    stack->top++;                            //指針加1,指向下一內存單元
    return 1;
}

Bool pop(MyStack *stack, ElementType * outputData)
{
    if(isEmpty(stack))
    {
        printf("stack is empty\n");
        return 0;
    }
    stack->top--;                                //指針減1後指向棧中最頂上的元素
    *outputData = *(stack->top);                //取值
    return 1;
}

void printStack(MyStack *stack)
{
    if(stack!= NULL)
    {
        if(stack->bottom == stack->top)
        {
            printf("stack is empty\n");
        }
        else
        {
            /*for(int i = 0 ; i < stack->top - stack->bottom ; i++)
                printf("%d\n",stack->bottom[i] );*/
            ElementType * element = stack->bottom;
            for(;element != stack->top ; element++)
                printf("%d\n",*element);
        }
    }
}
//stacktest.c
#include "mystack.h"
#include <stdio.h>

 int main(int argc, char const *argv[])
{
    /* code */
    int a,b,c;
    MyStack* stack = initStack(2);
    push(stack,1);
    push(stack,2);
    printStack(stack);       //預期輸出 1 、2
    push(stack,3);
    printStack(stack);        //預期輸出 1、2、3
    pop(stack,&a);
    pop(stack,&b);
    push(stack,4);
    pop(stack,&c);
    printf("a=%d  b=%d c=%d\n",a,b,c );   //預期輸出 a=3 b=2 c=4
    makeStackEmpty(stack);            
    pop(stack,&a);                    //預期輸出 stack is empty
    printf("a=%d\n", a);            //預期輸出 a=3
    freeStack(stack);

    return 0;
}

 

 

參考 :  百度文庫

    http://blog.csdn.net/mci2004/article/details/7532205

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved