栈的基本操作(+实例)

栈:是限定仅在表尾进行插入或删除操作的线性表,表尾段称为栈顶,表头段称为栈底,栈有称后进先出线性表。栈有顺序栈和链栈。

一、栈的顺序存储

1、顺序栈的结构定义

//顺序栈的存储结构
typedef struct{
    ElemType *base;//栈底指针变量 
    ElemType *top;//栈顶指针变量 
    int stackSize;//当前可使用的最大容量 
}sqStack;

2、创建一个空栈

//创建一个空栈
#define STACK_INIT_SIZE 100  //存储空间初始分配量 
#define STACKINCREMENT 10 //存储空间分配增量 
Status InitStack(SqStack &s){
    s.base = (ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
    if( !s.base )
        exit(OVERFLOW);
    s.top = s.base;
    s.stackSize = STACK_INIT_SIZE;
    return OK;
} 

3、元素入栈

//元素入栈
Status Push(SqStack &s, ElemType e){
    if( s.top-s.base >= s.stackSize ){//若栈满则追加空间 
        s.base = (ElemType *)realloc(s.base,(s.stackSize+STACKINCREAMENT)*sizeof(ElemType));
        if( !s.base )
            exit(OVERFLOW);
        s.top = s.base+s.stackSize; //设置栈顶
        s.stackSize = s.stackSize+STACKINCERMENT; //设置栈的最大容量 
    }
    *s.top = e;
    s.top++; 
    //*s.top++ = e;
}

4、元素出栈

//元素出栈 
Status Pop(SqStack &s, ElemType &e){
    //若栈不为空,则用e返回s的栈顶元素
    if( s.top == s.base )
        return ERROR;
    e = *--s.top;  //s.top指针先向下移动一个位置,再取出其中的元素
    return OK; 
} 

5、清空一个栈(将栈顶指针指向栈底指针)

//清空一个栈
Status ClearStack(SqStack &s){
    s.top = s.base; //栈顶指针指向栈底指针
    return OK; 
} 

6、销毁一个栈

//销毁栈
Status DestroyStack(SqStack &s){
    int len = s.stackSize;
    for(int i =0; i < len; i++){
        free(s.base);
        s.base++;
    }
    s.base = s.top = NULL;
    s,stackSize = 0;
} 

7、返回栈的当前容量

//返回栈当前容量
Status StackLen(SqStack &s){
    return (s.yop-s.base);
} 

栈的应用(进制间的转换):

 1 //二进制转十进制
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 #include<math.h>
 5 
 6 #define STACK_INIT_SIZE 20
 7 #define STACKINCREMENT 10
 8 
 9 typedef char ElemType;
10 
11 typedef struct{
12     ElemType *base;
13     ElemType *top;
14     int stackSize;
15 }sqStack;
16 
17 void InitStack(sqStack &s){
18     s.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
19     if( !s.base )
20         exit(0);
21     s.top = s.base;
22     s.stackSize = STACK_INIT_SIZE;
23 }
24 
25 void Push(sqStack &s, ElemType e){
26     if( s.top-s.base >= s.stackSize ){
27         s.base = (ElemType *)realloc(s.base, (s.stackSize+STACKINCREMENT)*sizeof(ElemType));
28         if( !s.base )
29             exit(0);
30     }
31     *s.top = e;
32     s.top++;
33 }
34 
35 void Pop(sqStack &s, ElemType &e){
36     if( s.top == s.base )
37         return ;
38     e = *--s.top;
39 }
40 
41 int StackLen(sqStack s){
42     return (s.top-s.base);
43 } 
44 
45 int main(){
46     ElemType c;
47     int len,sum = 0;
48     sqStack s;
49     InitStack(s);
50     printf("请输入一个二进制数,输入#表示结束!\n");
51     scanf("%c",&c);
52     while( c != '#' ){
53         Push(s,c);
54         scanf("%c",&c);
55     }
56     getchar();
57     len = StackLen(s);
58     printf("栈的当前容量是:%d\n",len);
59     for(int i = 0; i <len; i++){
60         Pop(s,c);
61         sum = sum+(c-48)*pow(2,i);
62     }
63     printf("转化为十进制数为:%d\n",sum);
64     return 0; 
65 } 

 

 

posted @ 2018-11-08 01:45  无心小男  阅读(8381)  评论(0编辑  收藏  举报