栈的基本操作(线性存储)

来源:互联网 发布:淘宝手链知乎 编辑:程序博客网 时间:2024/05/18 00:26

栈的基本操作,包括初始化、压栈、入栈、判断栈是否为空、以及取栈顶元素

#include <stdio.h>#include <stdlib.h>#include <iostream>using namespace std;#define STACK_INIT_SIZE 50#define STACKINCREMENT 10typedef int Elemtype;typedef struct Stack{Elemtype *data;int top;int stacksize;}SqStack;//栈的初始化void InitStack(SqStack &s){s.data = (Elemtype *) malloc(sizeof(Elemtype[STACK_INIT_SIZE])); //用动态数组来分配顺序存储的空间if(!s.data){cout<<"初始化失败!"<<endl;exit(-1);}s.top = -1;  //开始时,栈顶指针指向-1s.stacksize = STACK_INIT_SIZE;}//压栈操作,将 elem 压入栈顶void Push(SqStack &s,Elemtype elem){if(s.top >= s.stacksize-1)  //栈满{Elemtype *p = (Elemtype *) realloc (s.data,(s.stacksize + STACKINCREMENT) * sizeof(Elemtype));if( !p){cout<<"栈满时,重新分配内存失败!"<<endl;exit(-1);}s.data = p;s.stacksize = s.stacksize + STACKINCREMENT;}s.data[++s.top] = elem; //先自增s.top,然后赋值}//出栈操作void Pop(SqStack &s){if(s.top == -1) //先判断栈是否为空{cout<<"出栈错误,栈为空!"<<endl;//exit(-1);}elsecout<<"出栈的元素为:"<<s.data[s.top--]<<endl;}//去栈顶元素,和出栈差不多Elemtype GetTop(SqStack &s){if(s.top == -1) //先判断栈是否为空{cout<<"出栈错误,栈为空!"<<endl;//exit(-1);}elsereturn s.data[s.top]; //这里就不需要改变 top 指针了,只是取出元素}//判断是否为空栈void StackEmpty(SqStack &s){if(s.top == -1)cout<<"栈为空!"<<endl;elsecout<<"栈非空!"<<endl;}int main(){SqStack s;//栈初始化cout<<"------------栈初始化:------------"<<endl;InitStack(s);StackEmpty(s);//压栈操作cout<<"------------压栈操作:------------"<<endl;Elemtype n;cout<<"请输入要压栈的元素:";while(scanf("%d",&n) != EOF){Push(s,n);cout<<"此时栈顶元素:"<<GetTop(s)<<endl;cout<<"请输入要压栈的元素:";}StackEmpty(s);//出栈操作cout<<"------------出栈操作------------"<<endl;Pop(s);cout<<"此时栈顶元素:"<<GetTop(s)<<endl;Pop(s);cout<<"此时栈顶元素:"<<GetTop(s)<<endl;StackEmpty(s);return 0;}



0 0