⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 4.2.c

📁 数据结构(c++)栈顺序存储结构的全部操作 以及数据类型转换
💻 C
字号:
//库函数和常量定义:
#include <malloc.h>
#include <stdio.h>
#include <iostream.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define SINIT_SIZE 100       //存储空间初始分配量
#define conver 8
#define STACKINCREMENT 10    //存储空间分配增量
typedef int Status;
typedef char SElemType;
//(1)栈顺序存储结构的定义:
typedef struct{
      SElemType *base;       //在栈构造之前和销毁时,base=NULL.
      SElemType *top;        //栈顶指针
      int stacksize;         //当前已分配的存储空间,以元素为单位。
}SqStack;

//(2)初始化栈算法
Status InitStack(SqStack *S) //构造一个空栈S
{
	S->base=(SElemType *)malloc(SINIT_SIZE*sizeof(SElemType));
	if (!S->base)  return (ERROR);
    S->top=S->base;
       //空栈。
	S->stacksize=SINIT_SIZE;
	return OK;
}

//(3)获得栈顶元素算法
Status GetTop(SqStack S,SElemType *e)
//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
{
	if (S.top==S.base) return ERROR;
	*e=*(S.top-1);
	return OK;
}

//(4)进栈算法
Status Push(SqStack *S,SElemType e)   //插入元素e为新的栈顶元素
{
	if (S->top-S->base>=S->stacksize)
	{     //栈满,追加存储空间  
		S->base=(SElemType *)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(SElemType));
		if (!S->base) return(ERROR);     //存储分配失败
		S->top=S->base+S->stacksize;
		S->stacksize+=STACKINCREMENT;
	}
	*S->top++=e;   //*(S->top)=e;S->top++;
	return OK;
}

//(5)出栈算法
Status Pop(SqStack *S,SElemType *e)
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
{
	if (S->top==S->base) return ERROR;  //判栈空
	*e=*--S->top;
	return OK;
}

//(6)遍历栈算法
Status print(SqStack S)   //遍历栈
{
	SElemType *p;
	p=S.base++;
	if (S.top==p)
	{
		printf("sorry!栈为空!\n");
		return ERROR;
	}
	printf("栈中的元素为:\n");
	for (;p<S.top;p++)
		printf("%c\n",*(p));
	return OK;
}

//(7)销毁栈算法
Status  DestroyStack(SqStack *S)  //销毁栈S,S不再存在
{
	SElemType *q;SqStack *p;
	q=S->base;
	free(q);
	p=S;
	free(p);
	printf("栈已销毁,不存在!\n");
	return OK;
}

//(8)清空栈算法
Status ClearStack(SqStack *S)
{
	if (!S->base)  return (ERROR);
    S->top=S->base;  //空栈
	//栈的容量大小未变
	printf("栈已清空!");
	return OK;	
}

//(9)判栈空算法
Status StackEempty(SqStack S)  //判空
{
	if (S.top==S.base) return TRUE;
	else return FALSE;
}

//(10)求栈长
int StackLength(SqStack S)
{
	return (S.top-S.base);
}

void conversion()
//对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数;
{
    SqStack s1;int N,n; SElemType e;
	InitStack(&s1);
	printf("请输入一个十进制数:");
	scanf("%d",&N);
	n=N;
	while (n){
		Push(&s1,n%conver);
		n/=conver;
	}
	printf("其对应的八进制数为:");
	while (!StackEempty(s1))
	{	
	  Pop(&s1,&e);
	  printf("%d",e);	
	}
	printf("H\n");
}


void main()         
{
	printf("\t\t进制转换:10->%d\n\n\n",conver);
	conversion();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -