实验内容
实验目的:了解栈逻辑结构的特点,掌握栈的基本操作,为应用奠定基础。
实验内容:以顺序存储或链式存储实现栈,完成栈的初始化、入栈、出栈,栈元素输出等基本操作。
实验步骤:
- 定义实现栈的数据结构
- 栈的初始化
- 入栈、出栈
- 求栈顶元素的值
- 求栈元素的个数
- 利用栈把十进制数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