A-C/ex3_1.c

298 lines
5.4 KiB
C
Raw Normal View History

2022-03-27 11:51:05 +00:00
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#define MAX 100
typedef int DataType;
typedef struct {
DataType data[MAX]; // 元素
int top; // 栈顶指针
}SqStack;
typedef struct {
char data[MAX]; // 元素
int top; // 栈顶指针
}SqStackChar;
2022-04-01 00:58:14 +00:00
void InitStack(SqStack *L){
2022-03-27 11:51:05 +00:00
L->top = -1;
printf("\n初始化成功\n");
}
int Push(SqStack *L, DataType e){
2022-04-01 00:58:14 +00:00
if(L->top == MAX-1){
2022-03-27 11:51:05 +00:00
return 0;
} else {
L->top++;
L->data[L->top]=e;
return 1;
}
}
int Pop(SqStack *L, DataType *e){
2022-04-01 00:58:14 +00:00
if(L->top ==- 1){
2022-03-27 11:51:05 +00:00
return 0;
} else {
*e=L->data[L->top];
L->top--;
return 1;
}
}
int GetTop(SqStack *L, DataType *e){
2022-04-01 00:58:14 +00:00
if(L->top == -1){
2022-03-27 11:51:05 +00:00
return 0;
} else {
*e=L->data[L->top];
return 1;
}
}
int StackEmpty(SqStack L){
2022-04-01 00:58:14 +00:00
if(L.top == -1){
2022-03-27 11:51:05 +00:00
return 1;
} else {
return 0;
}
}
int StackFull(SqStack L){
2022-04-01 00:58:14 +00:00
if(L.top == MAX-1){
2022-03-27 11:51:05 +00:00
return 1;
} else {
return 0;
}
}
void OutputStack(SqStack L){
printf("\n\n");
2022-04-01 00:58:14 +00:00
for(int i=0; i<L.top+1; i++){
printf("第 %d 个元素的值为:%d\n", i+1, L.data[i]);
2022-03-27 11:51:05 +00:00
}
printf("\n\n");
}
2022-04-01 00:58:14 +00:00
int InsertStack(SqStack *L, int i, DataType e){
if(L->top == MAX-1){
2022-03-27 11:51:05 +00:00
return 0;
} else {
// 验证位置
if(i>L->top+1 || i<0){
return 0;
}
// 将 i 及其以后的元素向后移动 1 个单位
2022-04-01 00:58:14 +00:00
for(int j=L->top+1; j<i-1; j--){
2022-03-27 11:51:05 +00:00
L->data[j] = L->data[j-1];
}
// 插入
L->data[i-1]=e;
L->top++;
return 1;
}
}
2022-04-01 00:58:14 +00:00
int DeleteListData(SqStack *L, DataType e){
for(int i=0; i<L->top+1; i++){
2022-03-27 11:51:05 +00:00
if(L->data[i]==e){
// 将 i 以后的元素向前移动 1 个单位
2022-04-01 00:58:14 +00:00
for(int j=i; j<L->top+1; j++){
2022-03-27 11:51:05 +00:00
L->data[j]=L->data[j+1];
}
L->top--;
return 1;
}
}
return 0;
}
2022-04-01 00:58:14 +00:00
int DeleteListPos(SqStack *L, int i){
2022-03-27 11:51:05 +00:00
// 验证位置
if(i>L->top+1 || i<0){
return 0;
}
// 将 i-1 以后的元素向前移动 1 个单位
2022-04-01 00:58:14 +00:00
for(int j=i-1; j<L->top+1; j++){
2022-03-27 11:51:05 +00:00
L->data[j]=L->data[j+1];
}
L->top--;
return 1;
}
2022-04-01 00:58:14 +00:00
char NumToChar(int n){
2022-03-27 11:51:05 +00:00
if(n>=0 && n<=9){
return (char)('0'+n);
} else {
return (char)('A'+n-10);
}
}
int PushChar(SqStackChar *L, char e){
2022-04-01 00:58:14 +00:00
if(L->top == MAX-1){
2022-03-27 11:51:05 +00:00
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;
}
}
2022-04-01 00:58:14 +00:00
void Base(SqStackChar *L, int n, int e){
2022-03-27 11:51:05 +00:00
int i;
char temp;
// 转换
while(e){
2022-04-01 00:58:14 +00:00
PushChar(L, NumToChar(e%n)); // 进栈
2022-03-27 11:51:05 +00:00
e=e/n;
}
// 输出
printf("\n转换后的数为:");
while(1){
i=PopChar(L, &temp);
if(i==0){
break;
} else {
printf("%c",temp);
}
}
printf("\n\n");
}
2022-04-01 00:58:14 +00:00
void Palindrome(SqStackChar *L, int e){
2022-03-27 11:51:05 +00:00
int i=1,n=e;
char temp,temp1;
// 转换
while(n){
2022-04-01 00:58:14 +00:00
PushChar(L, NumToChar(n%10)); // 进栈
2022-03-27 11:51:05 +00:00
n/=10;
}
// 比较
while(e){
i=PopChar(L, &temp);
if(i==0){
break;
} else {
2022-04-01 00:58:14 +00:00
temp1=NumToChar(e%10);
2022-03-27 11:51:05 +00:00
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;
2022-04-01 00:58:14 +00:00
InitStack(&L1); // 初始化
2022-03-27 11:51:05 +00:00
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<n;i++){
printf("请输入第 %d 个元素:",i+1);
scanf("%d",&e);
Push(&L1,e);
}
OutputStack(L1);
break;
case 2:
n=Pop(&L1,&e);
if(n>-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);
2022-04-01 00:58:14 +00:00
n=InsertStack(&L1,n-1,e);
2022-03-27 11:51:05 +00:00
if(!n){
printf("插入失败,位置输入错误。\n");
} else {
printf("插入成功。\n");
}
}
break;
case 6:
printf("请输入需要删除的元素的值:");
scanf("%d",&e);
2022-04-01 00:58:14 +00:00
n=DeleteListData(&L1,e);
2022-03-27 11:51:05 +00:00
if(n==0){
printf("删除失败,元素不存在。\n");
} else {
printf("删除成功\n");
}
OutputStack(L1);
break;
case 7:
printf("请输入需要删除的元素的位置:");
scanf("%d",&n);
2022-04-01 00:58:14 +00:00
n=DeleteListPos(&L1,n);
2022-03-27 11:51:05 +00:00
if(n==0){
printf("删除失败,位置不存在。\n");
} else {
printf("删除成功\n");
}
OutputStack(L1);
break;
case 8:
L2.top = -1; // 初始化
printf("请输入需要转换的十进制数:");
scanf("%d",&e);
printf("请输入需要转换成的进制:");
scanf("%d",&n);
2022-04-01 00:58:14 +00:00
Base(&L2,n,e);
2022-03-27 11:51:05 +00:00
break;
case 9:
L2.top = -1; // 初始化
printf("请输入需要判断的回文数:");
scanf("%d",&e);
2022-04-01 00:58:14 +00:00
Palindrome(&L2,e);
2022-03-27 11:51:05 +00:00
break;
default:
break;
}
printf("请按任意键继续...");
getch();
system("cls");
}
printf("感谢使用,再见\n");
return 0;
}