diff --git a/ex3_1.c b/ex3_1.c new file mode 100644 index 0000000..69dd28f --- /dev/null +++ b/ex3_1.c @@ -0,0 +1,297 @@ +#include +#include +#include +#include +#define MAX 100 +typedef int DataType; +typedef struct { + DataType data[MAX]; // 元素 + int top; // 栈顶指针 +}SqStack; +typedef struct { + char data[MAX]; // 元素 + int top; // 栈顶指针 +}SqStackChar; + +void initStack(SqStack *L){ + L->top = -1; + printf("\n初始化成功\n"); +} +int Push(SqStack *L, DataType e){ + if(L->top==MAX-1){ + return 0; + } else { + L->top++; + L->data[L->top]=e; + return 1; + } +} +int Pop(SqStack *L, DataType *e){ + if(L->top==-1){ + return 0; + } else { + *e=L->data[L->top]; + L->top--; + return 1; + } +} +int GetTop(SqStack *L, DataType *e){ + if(L->top==-1){ + return 0; + } else { + *e=L->data[L->top]; + return 1; + } +} +int StackEmpty(SqStack L){ + if(L.top==-1){ + return 1; + } else { + return 0; + } +} +int StackFull(SqStack L){ + if(L.top==MAX-1){ + return 1; + } else { + return 0; + } +} +void OutputStack(SqStack L){ + printf("\n\n"); + for(int i=0;itop==MAX-1){ + return 0; + } else { + // 验证位置 + if(i>L->top+1 || i<0){ + return 0; + } + // 将 i 及其以后的元素向后移动 1 个单位 + for(int j=L->top+1;jdata[j] = L->data[j-1]; + } + // 插入 + L->data[i-1]=e; + L->top++; + return 1; + } +} +int DeleteList1(SqStack *L, DataType e){ + for(int i=0;itop+1;i++){ + if(L->data[i]==e){ + // 将 i 以后的元素向前移动 1 个单位 + for(int j=i;jtop+1;j++){ + L->data[j]=L->data[j+1]; + } + L->top--; + return 1; + } + } + return 0; +} +int DeleteList2(SqStack *L, int i){ + // 验证位置 + if(i>L->top+1 || i<0){ + return 0; + } + // 将 i-1 以后的元素向前移动 1 个单位 + for(int j=i-1;jtop+1;j++){ + L->data[j]=L->data[j+1]; + } + L->top--; + return 1; +} +char num_to_char(int n){ + if(n>=0 && n<=9){ + return (char)('0'+n); + } else { + return (char)('A'+n-10); + } +} +int PushChar(SqStackChar *L, char e){ + if(L->top==MAX-1){ + return 0; + } else { + L->top++; + L->data[L->top]=e; + return 1; + } +} +int PopChar(SqStackChar *L, char *e){ + if(L->top==-1){ + return 0; + } else { + *e=L->data[L->top]; + L->top--; + return 1; + } +} +void base(SqStackChar *L, int n, int e){ + int i; + char temp; + // 转换 + while(e){ + PushChar(L, num_to_char(e%n)); // 进栈 + e=e/n; + } + // 输出 + printf("\n转换后的数为:"); + while(1){ + i=PopChar(L, &temp); + if(i==0){ + break; + } else { + printf("%c",temp); + } + } + printf("\n\n"); +} +void huiwen(SqStackChar *L, int e){ + int i=1,n=e; + char temp,temp1; + // 转换 + while(n){ + PushChar(L, num_to_char(n%10)); // 进栈 + n/=10; + } + // 比较 + while(e){ + i=PopChar(L, &temp); + if(i==0){ + break; + } else { + temp1=num_to_char(e%10); + e/=10; + if(temp!=temp1){ + i=0; + break; + } + } + } + // 输出 + if(i){ + printf("此数为回文数。\n"); + } else { + printf("此数不为回文数。\n"); + } +} +int main(){ + SqStack L1; + SqStackChar L2; + int n,choice; + DataType e; + initStack(&L1); // 初始化 + + for(;;){ + printf("\t\t1.入栈\n"); + printf("\t\t2.出栈\n"); + printf("\t\t3.输出所有元素\n"); + printf("\t\t4.读取栈顶元素\n"); + printf("\t\t5.插入元素\n"); + printf("\t\t6.删除指定值的元素\n"); + printf("\t\t7.删除指定位置的元素\n"); + printf("\t\t8.进制转换\n"); + printf("\t\t9.回文数判断\n"); + printf("\t\t0.退出\n"); + + printf("请选择:"); + scanf("%d",&choice); + if(choice==0) break; + switch (choice) { + case 1: + printf("请输入需要输入的元素个数:"); + scanf("%d",&n); + for(int i=0;i-1){ + printf("出栈元素为 %d\n",e); + } else { + printf("栈为空\n"); + } + break; + case 3: + OutputStack(L1); + break; + case 4: + n=GetTop(&L1,&e); + if(n>-1){ + printf("栈顶元素为 %d\n",e); + } else { + printf("栈为空\n"); + } + break; + case 5: + if(StackFull(L1)){ + printf("栈已满,无法入栈。"); + } else { + printf("请输入要插入的位置:"); + scanf("%d",&n); + printf("请输入要插入的元素:"); + scanf("%d",&e); + n=insertStack(&L1,n-1,e); + if(!n){ + printf("插入失败,位置输入错误。\n"); + } else { + printf("插入成功。\n"); + } + } + break; + case 6: + printf("请输入需要删除的元素的值:"); + scanf("%d",&e); + n=DeleteList1(&L1,e); + if(n==0){ + printf("删除失败,元素不存在。\n"); + } else { + printf("删除成功\n"); + } + OutputStack(L1); + break; + case 7: + printf("请输入需要删除的元素的位置:"); + scanf("%d",&n); + n=DeleteList2(&L1,n); + if(n==0){ + printf("删除失败,位置不存在。\n"); + } else { + printf("删除成功\n"); + } + OutputStack(L1); + break; + case 8: + L2.top = -1; // 初始化 + printf("请输入需要转换的十进制数:"); + scanf("%d",&e); + printf("请输入需要转换成的进制:"); + scanf("%d",&n); + base(&L2,n,e); + break; + case 9: + L2.top = -1; // 初始化 + printf("请输入需要判断的回文数:"); + scanf("%d",&e); + huiwen(&L2,e); + break; + default: + break; + } + printf("请按任意键继续..."); + getch(); + system("cls"); + } + printf("感谢使用,再见\n"); + return 0; +}