顺序栈和链栈

来源:互联网 发布:好看的淘宝金酷娃玩具 编辑:程序博客网 时间:2024/06/08 09:37
今天学了顺序栈和链栈,自己写了一下代码:
//#include <stdio.h>//#include <stdlib.h>/*//顺序栈的实现与简单应用//实现提供操作init_stack(初始化链表).clearstack(制空栈),Push(插入),Pop(删除),Is_empty(判空).Is_full(判满)//GetTop(读栈顶元素)//代码:#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>using namespace std;typedef int typestack;#define stacksize 100typedef struct {int top;typestack stack[stacksize];}seqstack;bool Is_empty(seqstack *);bool Is_full(seqstack *);void Init_stack(seqstack *);void clear_stack(seqstack *);void Push(seqstack *,typestack );typestack Pop(seqstack *);int Search_stack(seqstack *,typestack );typestack GetTop(seqstack *);bool Is_empty(seqstack *p){return p->top==-1;}bool Is_full(seqstack *p){return p->top==stacksize-1;}void Init_stack(seqstack *p){p->top=-1;}void clear_stack(seqstack *p){p->top=-1;}void Push(seqstack *p,typestack x){if(Is_full(p)){printf("栈满\n");return ;}p->stack[++p->top]=x;}typestack Pop(seqstack *p){if(Is_empty(p)){printf("栈空\n");return 0;}return p->stack[p->top--];}int Search_stack(seqstack *p,typestack x){for(int i=0;i<=p->top;i++)if(p->stack[i]==x)return i+1;printf("不存在\n");return 0;}typestack GetTop(seqstack *p){if(Is_empty(p)){printf("栈空");return 0;}return p->stack[p->top];}int main(){int i;seqstack x;seqstack *p=&x;Init_stack(p);    for(i=0;i<7;i++)      Push(p,i);while(!Is_empty(p))printf("%d ",Pop(p));return 0;}*///链栈//提供如下操作:1判空2插入3清空4删除5查看栈顶元素#include <iostream>#include <stdio.h>#include <stdlib.h>using namespace std;typedef int typestack;typedef struct seqs{typestack x;struct seqs *next;}*seqstack,seqstackment;bool Is_empty(seqstack &top){return top==NULL;}void Push(seqstack &top,typestack v){seqstack p=(seqstack)malloc(sizeof(seqstackment));p->x=v;p->next=top;top=p;}typestack Pop(seqstack &top){if(!Is_empty(top)){seqstack p=top->next;typestack v=top->x;free(top);top=p;return v;}printf("栈空\n");return 0;}typestack GetTop(seqstack &top){if(!Is_empty(top))return top->x;printf("栈空\n");return 0;}void clear_stack(seqstack &top){while(Is_empty(top)) Pop(top);}int main(){    seqstack p=NULL;    for(int i=0;i<7;i++)Push(p,i);while(!Is_empty(p))printf("%d ",Pop(p));return 0;}下面是栈的一些简单应用:
括号匹配:
bool Is_match(char ch1,char ch2){if(ch1=='(' && ch2==')' || ch1==')' && ch2=='(' )return true;else if(ch1=='[' && ch2==']' || ch1==']' && ch2=='[')return true;else if(ch1=='{' && ch2=='}' || ch1=='}' && ch2=='{')return true;return false;}void Kh_Match(char *str){seqstack top=NULL;char ch;for(int i=0;str[i];i++){switch(str[i]){case '(':case '[':case '{':Push(top,str[i]);break;case ')':case ']':case '}':if(Is_empty(top)){printf("右括号多余\n");return ;}ch=GetTop(top);if(Is_match(ch,str[i])){Pop(top);break;}else{printf("括号不匹配\n");return ;}}}if(Is_empty(top))printf("括号匹配\n");elseprintf("左括号多余\n");}
//10进制与其他的转换(10转2、8、16)void Trans_num(int n,int m)//2,8{   seqstack top=NULL;  while(n)  {   Push(n%m);   n/=m;  }  if(Is_empty(top))   printf("0\n");  while(!Is_empty(top))  printf("%d ",Pop()); }
//运算符优先级bool Is_number(char ch){ switch(ch) {  case '0': case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9': return true;  default : return false; }}
bool Comparech(char ch1,char ch2){ switch(ch1) {case '*': switch(ch2) {case '*':case '/':return false;case '#':case '+':case '-':return true; }case '/': switch(ch2) {case '*':case '/':return false;case '#':case '+':case '-':return true; }case '+': switch(ch2) {case '*':case '+':case '-':case '/':return false;case '#':return true; }case '-': switch(ch2) {case '*':case '/':case '+':case '-':return false;case '#':return true; }case '#':return false; }}
int Calcu_complex(){ seqstack Num==NULL; seqstack Ope=NULL; Push(Ope,'#'); char ch=getchar(); char str; int a,b; if(ch=='#'){  printf("there are no operating enements\n");  return 0; } while(ch!='#' || GetTop(Ope)!='#') {  if(Is_number(ch)){   Push(Num,ch-'0');   ch=getchar();  }  else  {   if(Comparech(ch,GetTop(Ope))){    Push(Ope,ch);    ch=getchar();   }   else{    a=Pop(Num);    b=Pop(Num);    str=Pop(Ope);    switch(str)    {  case '*':Push(Num,b*a);break;  case '/':Push(Num,b/a);break;     case '+':Push(Num,b+a);break;        case '-':Push(Num,b-a);break;    }   }  } } return GetTop(Num);}
当然这些只不过是栈的简单应用,但是栈本身的思想:先进后出需要掌握。。。。
 

原创粉丝点击