栈的基本操作和应用

来源:互联网 发布:八种调度算法 编辑:程序博客网 时间:2024/06/16 12:30

栈的基本操作和应用

栈的顺序存储

实现代码:
#include <iostream>    using namespace std;    #define MAX 120//栈最大容量   class stack       {       private:           int arr[MAX];         int top;     public:        void inItStack()         {             top=-1;         }           stack()         {               inItStack();         }          bool isEmpty()        {            if(top == -1) return true;            else return false;        }          void push(int a)         {              top++;            if(top < MAX)  {                   arr[top]=a;             }else{                   cout<<"栈已满,无法存入"<<a<<endl;               }           }                                                                            int pop()        {                if(isEmpty())   {                   cout<<"STACK IS EMPTY ";                return NULL;               } else {                   int data=arr[top];                 arr[top]=NULL;                 top--;                return data;             }           }       };       int main()       {           int i;      stack a;       for(i=0;i<120;i++){          a.push(i);          }         cout<<"Pop:"<<a.pop()<<endl;        a.push(120);//由于前面一行,出栈了一个数,所以还可以入栈一个 a.push(121);//继续入栈则会报错      cout<<"Pop:"<<a.pop()<<endl;              return 0;       }


输出结果:
Pop:119栈已满,无法存入121Pop:120请按任意键继续. . .

二、栈的链式存储

实现代码:
#include<iostream>#include<malloc.h>#define maxsize 100using namespace std;typedef struct node{int data;struct node *next;}lnode ,*linkstack;//初始化栈void init(linkstack *top){if( ( (*top)=(linkstack)malloc(sizeof(lnode)) )==NULL )//(给*top分配一个存储空间让top指向这个空间) exit(-1);(*top)->next=NULL;} //判断是否为空int empty(linkstack top){if(top->next==NULL)return 1;else return 0;}//取出栈顶元素 int get(linkstack top,int *e){lnode *p;p=top->next; if(!p){cout<<"栈已空!";return 0;}else{*e=p->data;cout<<*e<<endl;return *e;}}//入栈操作 int push(linkstack top,int e){  lnode *p;if( (p=(linkstack)malloc(sizeof(lnode)))==NULL )//(给*top分配一个存储空间让top指向这个空间) {printf("分配内存失败");exit(-1);return 0;}p->data=e;p->next=top->next;top->next=p;return 1;}int pop1(linkstack top,int *e){linkstack p=top->next;if(p==NULL){cout<<"栈已空!";return 0; }top->next=p->next;*e=p->data;free(p);return 1;}int length(linkstack top){int i=0;lnode *p=top;while(p->next!=NULL){p=p->next;i++;}return i;}void clear(linkstack top){lnode *p,*q;p=top;while(!p){q=p;p=p->next;free(q);}}int main(){linkstack s;lnode *p;int i;int a[]={1,2,3};int e;init(&s);cout<<"将1 2 3依次入栈!"<<endl; for(i=0;i<sizeof(a)/sizeof(a[0]);i++){push(s,a[i]);}cout<<"栈顶元素为:";if(get(s,&e)==0){cout<<"栈为空";return 0; }cout<<"将4入栈"<<endl; push(s,4);cout<<"将5入栈"<<endl; push(s,5);cout<<"栈中元素个数为:"<<length(s)<<endl;cout<<"将5出栈"<<endl; pop1(s,&e); cout<<"将4出栈"<<endl;pop1(s,&e);cout<<"将3出栈"<<endl;pop1(s,&e); cout<<"栈中元素个数为:"<<length(s);cout<<endl;cout<<"出栈元素的序列:";while(!empty(s)){pop1(s,&e);cout<<e<<"  ";}cout<<endl;}


输出结果:
将1 2 3依次入栈!栈顶元素为:3将4入栈将5入栈栈中元素个数为:5将5出栈将4出栈将3出栈栈中元素个数为:2出栈元素的序列:2  1请按任意键继续. . .
三、栈的项目实践:
#include <stdio.h>  #include <stdlib.h>  #include <conio.h>  #define N 10  typedef struct   {      int data[N];//栈的元素      int top; //数组的下标,表示栈顶下标  }srack;  //初始化栈  void initsrack(srack *s)  {      s->top=-1;  }  //判断栈是否为空  void srackempty(srack *s)  {      if (s->top==-1)          printf("栈为空\n");      else          printf("栈不为空\n");  }  //删除栈顶元素  void pop(srack *s)  {      int e;      if (s->top==-1)          printf("栈为空");      else      {          e=s->data[s->top];          s->top--;          printf("删除元素%d后还剩%d个元素\n",e,s->top+1);      }  }  //入栈  void push(srack *s)  {      if (N-s->top==1)//栈满      {          printf("栈已满\n");      }      else      {          printf("输入进栈的值:");          scanf("%d",&s->data[++s->top]);          printf("入栈成功\n");      }  }  void print()  {      printf("输入口令:\n");      printf("1.判断栈是否为空\n");      printf("2.入栈\n");      printf("3.显示栈元素个数以及栈顶元素\n");      printf("4.删除栈顶元素\n");      printf("5.退出\n\n\n");  }  void display(srack *s)  {      if (s->top==-1)          printf("栈为空");      else      printf("此时栈有%d个元素,栈顶元素为%d\n",s->top+1,s->data[s->top]);  }  int main()  {      print();//显示菜单      int n;//口令变量      int c=1;      srack *s;      s=(srack*)malloc(sizeof(srack));      initsrack(s);//初始化栈        while (c)      {      printf("\n输入操作口令:\n");      scanf("%d",&n);       system("cls");//清屏        print();        switch(n)      {      case 1:srackempty(s);break;//判断栈是否为空      case 2:push(s);break;//入栈      case 3:display(s);break;//显示      case 4:pop(s);break;//出栈      case 5:c=0;      }      }  }  



阅读全文
0 0
原创粉丝点击