添加 'ex3_1.c'
This commit is contained in:
parent
8ffc6b0c24
commit
7de204451e
297
ex3_1.c
Normal file
297
ex3_1.c
Normal file
@ -0,0 +1,297 @@
|
|||||||
|
#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;
|
||||||
|
|
||||||
|
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;i<L.top+1;i++){
|
||||||
|
printf("第 %d 个元素的值为:%d\n",i+1,L.data[i]);
|
||||||
|
}
|
||||||
|
printf("\n\n");
|
||||||
|
}
|
||||||
|
int insertStack(SqStack *L, int i, DataType e){
|
||||||
|
if(L->top==MAX-1){
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
// 验证位置
|
||||||
|
if(i>L->top+1 || i<0){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
// 将 i 及其以后的元素向后移动 1 个单位
|
||||||
|
for(int j=L->top+1;j<i-1;j--){
|
||||||
|
L->data[j] = L->data[j-1];
|
||||||
|
}
|
||||||
|
// 插入
|
||||||
|
L->data[i-1]=e;
|
||||||
|
L->top++;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int DeleteList1(SqStack *L, DataType e){
|
||||||
|
for(int i=0;i<L->top+1;i++){
|
||||||
|
if(L->data[i]==e){
|
||||||
|
// 将 i 以后的元素向前移动 1 个单位
|
||||||
|
for(int j=i;j<L->top+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;j<L->top+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<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);
|
||||||
|
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;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user