栈(C语言实现)学习记录

来源:互联网 发布:jira mysql配置 编辑:程序博客网 时间:2024/05/16 19:15

栈(C语言实现)学习记录



题目: 写一个递归算法来实现字符串逆序存储,要求不另设存储空间。

问题分析:

由于要实现字符串的逆序存储,所以可以想到栈的先进后出的特性,刚好与此吻合,所以可通过栈来实现字符串的逆序存储。

1.栈的表示:

#include <stdio.h>

#include <stdlib.h>

#define MAX 10

typedef char ElemType;

typedef struct Stack{

    ElemType data[MAX];

    int top;

    int bottom;

    int length;

}Stack, * pStack;

 

2.初始化栈:

算法步骤:

1)将栈顶及栈底的索引设为0

2)将栈的长度初始化为0


算法描述:

void init(pStack stack){

    stack->top = stack->bottom = 0;

    stack->length = 0;

}

3.压栈:

算法步骤:

1)判断栈的长度是否大于栈的最大容量。

2)栈顶索引上移加1.

3)将栈元素压入到栈中。

4)栈的长度加1.

算法描述:

void push(pStack stack, ElemType e){

    if(stack->length > MAX){

        printf("栈溢出");

        return ;

    }

    stack->top++;

    stack->data[stack->top] = e;

    stack->length++;

}

算法分析:

T(n) = O(1);

4.出栈:

算法步骤:

1)判断栈中是否存在元素。

2)输出栈元素。

3)栈顶索引下移减1.

4)栈的长度减1.

算法描述:

void pop(pStack stack){

    if(stack->length <= 0){

        printf("无可输出元素");

        return ;

    }

    printf("%c", stack->data[stack->top]);

    stack->top--;

    stack->length--;

}

算法分析:

T(n) = O(1);

 

5.main函数:

int main()

{

   Stack stack;

   init(&stack);

   int i = 0;

   int j = 0;

   char ch;

   printf("===========input================\n");

   while(i < MAX){

       printf("Enter elem:");

       scanf("%c", &ch);

       getchar();

       push(&stack, ch);

       i++;

   }

   printf("\n=========output===============\n");

   for(j = MAX; j > 0; j--){

       pop(&stack);

   }

   return 0;

}

6.执行结果:



题目(算法设计题(5)):设二维数组啊a[1…m,1…n]含有m乘n个整数

1)写一个算法判断a 中所有元素是否互不相同?输出相关信息(yes/no)

2)试分析算法的时间复杂度。


算法步骤:

1) 将二维数组转换为一维数组。

2)  一个数组元素与其它剩余的数组元素对比。

算法描述:

status difference(ElemType arr[][N]){

    int *p=arr[0];

    int i=0, j, cnt=0;

    for( i=0; i<M*N; i++ ){

        for( j=i+1; j<M*N; j++ )

            if( *(p+i) == *(p+j) )

                cnt++;

    }

    if(cnt > 0){

        return 0;

    }

    return 1;

}

 执行结果如下:



算法分析:

T(n)= O(n2);

  

Main方法:

int main()

{

    ElemType arr[M][N];

    int i = 0;

    int j = 0;

    for(i = 0; i < M; i++){

        for(j = 0; j < N; j++){

            printf("Enter elem:");

            scanf("%d", &arr[i][j]);

            }

        }

    printf("the elements is diffent:");

    if(difference(arr) == 1){

        printf("yes");

    }else{

        printf("no");

    }

    return 0;

}


 

 

 

 

 

 分享(share )是快乐的,也是见证个人的成长历程,文章主要为平时学习积累,基于自身认知不足之处在所难免,也恳请大家指正共同进步

 

 

 

 

 

 

 

 



原创粉丝点击