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