实验五 栈的顺序存储结构

本文介绍了顺序栈的抽象数据类型及其在进制转换中的应用。通过C语言实现顺序栈的初始化、入栈、出栈、获取栈顶元素、获取栈长等操作,并展示了如何利用栈将十进制数转换为任意进制数。实验包括创建空栈、入栈、出栈、求栈顶元素、栈的长度以及进制转换的示例代码和运行结果。
摘要由CSDN通过智能技术生成


实验内容

实验目的:了解栈逻辑结构的特点,掌握栈的基本操作,为应用奠定基础。
实验内容:以顺序存储或链式存储实现栈,完成栈的初始化、入栈、出栈,栈元素输出等基本操作。
实验步骤:

  1. 定义实现栈的数据结构
  2. 栈的初始化
  3. 入栈、出栈
  4. 求栈顶元素的值
  5. 求栈元素的个数
  6. 利用栈把十进制数N转换为D进制数(自行设计输入输出格式)

顺序栈的抽象数据类型

ADT Stack{
Data: D={ai | ElemSet ai ,i=0,2,....n-1,n≥0}
Relations: R1={<ai,ai+1> | D ai,ai+1,i=0,2,....n-2,n20}
		   约定a0为栈底,an-1为栈顶
Operation:
(1)InitStack(&S):对栈S进行初始化,构造一个空栈。
(2) StackEmpty(S):判断栈是否为空栈。
(3)StackLength(S):返回栈的元素个数。
(4)GetTop(S,&e):取出栈S当前栈顶元素。
(5)Push(&S, X);网栈S中插入新的元素X。
(6)Pop(&S,&e):取出并删除栈S的栈顶元素e。
(7)StackTraverse(S):输出栈S所有元素。
}ADT Stack

实验示例

顺序栈的数据类型定义

/* 顺序栈表示:函数定义 */

#include <stdio.h>
#include <stdlib.h>
/* 顺序栈表示:类型和界面函数声明 */

//1.定义实现栈的数据结构
enum { MAXNUM = 20    /* 栈中最大元素个数,应根据需要定义 */
};

typedef char DataType; /* 栈中元素类型,应根据需要定义 */

struct SeqStack {	  /* 顺序栈类型定义 */
    int  t; 		  /* 栈顶位置指示 */
    DataType  s[MAXNUM];
};

typedef  struct SeqStack  *PSeqStack;	/* 顺序栈类型的指针类型 */ 

顺序栈的基本操作

/*创建一个空栈;为栈结构申请空间,并将栈顶变量赋值为-1*/
PSeqStack  createEmptyStack_seq( void ) {  
    PSeqStack pastack = (PSeqStack)malloc(sizeof(struct SeqStack));
    if (pastack==NULL)
        printf("Out of space!! \n");
    else
        pastack->t = -1;
    return pastack;
}

/*判断pastack所指的栈是否为空栈,当pastack所指的栈为空栈时,则返回1,否则返回0*/
int  isEmptyStack_seq( PSeqStack pastack ) {
    return pastack->t == -1;
}

/* 在栈中压入一元素x */
void  push_seq( PSeqStack pastack, DataType x ) {  
    if( pastack->t >= MAXNUM - 1  )
        printf( "Stack Overflow! \n" );
    else {  
        pastack->t++;
        pastack->s[pastack->t] = x;
    }
}

/* 删除栈顶元素 */
void  pop_seq( PSeqStack pastack ) {  	
    if (pastack->t == -1 )
        printf( "Underflow!\n" );
    else
        pastack->t--;
}

/* 当pastack所指的栈不为空栈时,求栈顶元素的值 */
DataType top_seq( PSeqStack pastack ) {
	if(!isEmptyStack_seq(pastack))
		return pastack->s[pastack->t];
	else
		printf("Stack is empty!!");
	return 0;
}

/*返回栈元素的个数*/
int StackLength( PSeqStack pastack ) {
	return pastack->t+1;
}

进制数转换

/*进制数转换*/
void conversion(int number, int d) {
	int data;
	char st;
	PSeqStack a;
	a = createEmptyStack_seq();
	while(number){
		st = number%d + 48;
		push_seq(a, st);
		number = number/d;
	}
	printf("After conversion: ");
	while( !isEmptyStack_seq(a) ){ 
		st = top_seq(a);
		printf( "%c",st );
		pop_seq(a);
	}
	putchar(10);
}

操作示例

void main()
{ 
	//2.栈的初始化
	PSeqStack S=createEmptyStack_seq();
	char st;

	//3.入栈、出栈
	push_seq(S,'A');
	push_seq(S,'B');
	push_seq(S,'C');
	push_seq(S,'D');
	push_seq(S,'E');
	while(!isEmptyStack_seq(S))
	{ 
		st=top_seq(S);
		printf( "%c",st );
		pop_seq(S);
	}
	putchar(10);

	//4.求栈顶元素的值
	st = top_seq(S);
	if(st!=0)
		printf( "The top stack is %c",st);
	putchar(10);
	push_seq(S,'A');
	push_seq(S,'B');
	push_seq(S,'C');
	push_seq(S,'D');
	push_seq(S,'E');
	st = top_seq(S);
	if(st!=0)
		printf( "The top stack is %c",st);
	putchar(10);

	//5.求栈元素的个数
	int len = StackLength(S);
	printf("The stack length is %d\n",len);

	//6.利用栈把十进制数N转换为D进制数(自行设计输入输出格式)
	int N;
	int D;
	printf("请输入十进制数N:");
	scanf("%d",&N);
	printf("请输入转换的进制数D:");
	scanf("%d",&D);
	conversion(N, D);
}

输出示例:

EDCBA
Stack is empty!!
The top stack is E
The stack length is 5
请输入十进制数N:15
请输入转换的进制数D:2
After conversion: 1111
Press any key to continue


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值