我是辛勤的小蜜蜂~~~哈哈~~码代码坐等比赛开始,我猜今晚皇马5:1大胜塞维利亚
下面来介绍下顺序栈。我们知道,栈具有一个栈顶指针,有些教材中的顺序栈的栈顶指针指向栈顶元素的下一个位置,但本文中的栈顶指针都指向栈顶元素。其中,S->data[0]是栈底元素,top是栈顶指针。
#include<cstdio>
#define StackSize 100 //假定预分配的栈空间最多为100个元素
typedef char Datatype; //假定栈元素的数据类型为字符
typedef struct {
Datatype data[StackSize];
int top;
}SeqStack;
//********************************栈的一些基本操作**********************************
void InitStack(SeqStack *S){
将顺序栈置空
S->top=-1;
}
int StackEmpty(SeqStack *S){
//判断顺序栈是否为空,若为空,则返回真,否则返回假
return S->top==-1;
}
int StackFull(SeqStack *S){
//判断栈是否满了,若满了则返回真,否则返回假
return S->top==StackSize-1;
}
void Push(SeqStack *S,Datatype x){
//进栈操作
if(StackFull(S)){
printf("Stack overflow\n"); //上溢,退出运行
return ;
}
S->data[++S->top]=x; //将栈顶指针加1后讲x入栈
}
void Pop(SeqStack *S){
//出栈操作
if(StackEmpty(S)){
printf("Stack underflow\n"); //下溢,退出运行
return ;
}
S->top--; //将栈顶指针减1
}
Datatype StackTop(SeqStack *S){
//取栈顶元素
if(StackEmpty(S)){ //栈空则无法取栈顶元素
printf("Stack is empty!\n");
return '?';
}
return S->data[S->top];
}
void CreateStack(SeqStack *S){
//建立一个栈
char ch;
while((ch=getchar())!='\n'){
Push(S,ch);
}
return ;
}
//***********************************测试函数********************************
int main(){
SeqStack *S;
InitStack(S);
printf("输入一个字符串,来建立一个字符顺序栈:\n");
CreateStack(S);
printf("栈已建好!\n");
printf("栈顶元素是:%c\n",StackTop(S));
printf("弹出栈顶元素:\n");
Pop(S);
printf("此时栈顶元素为:%c\n",StackTop(S));
printf("将元素‘Z’进栈:\n");
Push(S,'z');
printf("此时栈顶元素是:%c\n",StackTop(S));
return 0;
}
测试样例:
设想如果将数组的一端固定,看做栈底,另一端看做活动的,那么我们可以用数组来模拟顺序栈,具体代码如下。此时的指针相当于数组的指标。但此时对于多个栈的情况,处理起来不太方便,而且以下代码不具有很好的封装性。程序的具体运行样例与上一段代码相同,就不再贴出了。错误之处,还请指出!
#include<cstdio>
#define StackSize 100 //假定预分配的栈空间最多为100个元素
typedef char Datatype; //假定栈元素的数据类型为字符
int top; //栈顶指针,这里是全局变量,不太好
//********************************栈的一些基本操作**********************************
void InitStack(){
//将顺序栈置空
top=-1;
}
int StackEmpty(){
//判断顺序栈是否为空,若为空,则返回真,否则返回假
return top==-1;
}
int StackFull(){
//判断栈是否满了,若满了则返回真,否则返回假
return top==StackSize-1;
}
void Push(Datatype *S,Datatype x){
//进栈操作
if(StackFull()){
printf("Stack overflow\n"); //上溢,退出运行
return ;
}
S[++top]=x; //将栈顶指针加1后讲x入栈
}
void Pop(){
//出栈操作
if(StackEmpty()){
printf("Stack underflow\n"); //下溢,退出运行
return ;
}
top--; //将栈顶指针减1
}
Datatype StackTop(Datatype *S){
//取栈顶元素
if(StackEmpty()){ //栈空则无法取栈顶元素
printf("Stack is empty!\n");
return '?';
}
return S[top];
}
void CreateStack(Datatype *S){
//建立一个栈
char ch;
while((ch=getchar())!='\n'){
Push(S,ch);
}
return ;
}
//***********************************测试函数********************************
int main(){
Datatype Stack[StackSize];
InitStack();
printf("输入一个字符串,来建立一个字符顺序栈:\n");
CreateStack(Stack);
printf("栈已建好!\n");
printf("栈顶元素是:%c\n",StackTop(Stack));
printf("弹出栈顶元素:\n");
Pop();
printf("此时栈顶元素为:%c\n",StackTop(Stack));
printf("将元素‘Z’进栈:\n");
Push(Stack,'z');
printf("此时栈顶元素是:%c\n",StackTop(Stack));
return 0;
}