链栈,链栈的基本操作

链栈,链栈的基本操作

链栈,链栈的基本操作

图片 1

能理解这个图就OK了。

#include <iostream>
using namespace std;

typedef int DataType;
struct Node{
    DataType data;
    struct Node *link ;
};
typedef Node *PNode;

struct LinkStack{
    PNode top;
};
typedef LinkStack *PLinkStack;

PLinkStack createEmptyStack()
{
    PLinkStack plstack = (PLinkStack) malloc (sizeof(struct LinkStack));
    if(plstack != NULL)
        plstack ->top = NULL;
    else 
        cout<<"Out of spaces\n";
    return plstack;
}


int isEmpty(PLinkStack plstack)
{
    return plstack ->top ==NULL;
}

void push(PLinkStack plstack,DataType x)
{
    PNode p = (PNode) malloc (sizeof (struct Node));
    if(p!= NULL)
    {
        p ->data = x;
        p ->link = plstack -> top; //新元素的指针域指向栈顶元素。
        plstack -> top = p;    //新加入的元素作为栈顶。
    }
    else
        cout<<"Out of space\n";
}

void pop(PLinkStack  plstack)
{
    PNode  p = (PNode) malloc (sizeof(struct Node));
    if (p!= NULL)
    {
        p = plstack -> top;
        plstack ->top = plstack -> top -> link; //栈顶元素的下一个元素作为新的栈顶。
        free(p);
    }
    else
        cout<<"Empty stack\n";
}

DataType printTop(PLinkStack plstack)
{
    return plstack ->top ->data;
}

int main()
{
    int n;
    cin>>n;
    int t = n;
    int item;
    PLinkStack  plstack = createEmptyStack();

    while(n)
    {
        cin>>item;
        push(plstack,item);
        n--;
    }
    while(t)
    {    
        cout<<printTop(plstack)<<" ";
        pop(plstack);
        t--;
    }
    system("pause");
    return 0;
}

 

http://www.bkjia.com/cjjc/1014836.htmlwww.bkjia.comtruehttp://www.bkjia.com/cjjc/1014836.htmlTechArticle链栈,链栈的基本操作 能理解这个图就OK了。
#include iostream using namespace std;typedef int DataType; struct
Node{ DataType data; struct Node * link ;};typedef N…

_DataStructure_C_Impl:链栈

//_DataStructure_C_Impl:链栈
#include
#include

typedef char DataType;
typedef struct node{
 DataType data;
 struct node *next;
}LStackNode,*LinkStack;
//将链栈初始化为空。动态生成头结点,并将头结点的指针域置为空
void InitStack(LinkStack *top){
 if((*top=(LinkStack)malloc(sizeof(LStackNode)))==NULL)  //为头结点分配一个存储空间
  exit(-1);
 (*top)->next=NULL;  //将链栈的头结点指针域置为空
}
//判断链栈是否为空,就是通过判断头结点的指针域是否为空
int StackEmpty(LinkStack top){
 if(top->next==NULL)  //当链栈为空时,返回1;否则返回0
  return 1;
 else 
  return 0;
}
//进栈操作就是要在链表的第一个结点前插入一个新结点,进栈成功返回1
int PushStack(LinkStack top,DataType e){
 LStackNode *p; //指针p指向新生成的结点
 if((p=(LStackNode *)malloc(sizeof(LStackNode)))==NULL){
  printf(内存分配失败
);
  exit(-1);
 }
 p->data=e;
 p->next=top->next; //指针p指向表头结点
 top->next=p;
 return 1;
}
//删除单链表中的第i个位置的结点。删除成功返回1,失败返回0
int PopStack(LinkStack top,DataType *e){
 LStackNode *p;
 p=top->next;
 if(!p){  //判断链栈是否为空
  printf(栈已空
);
  return 0;
 }
 top->next=p->next; //将栈顶结点与链表断开,即出栈
 *e=p->data;  //将出栈元素赋值给e
 free(p);  //释放p指向的结点
 return 1;
}
//取栈顶元素操作
int GetTop(LinkStack top,DataType *e){
 LStackNode *p;
 p=top->next;
 if(!p){  //判断链栈是否为空
  printf(栈已空
);
  return 0;
 }
 *e=p->data; //将栈顶元素赋值给e
 return 1;
}
//求表长操作
int StackLength(LinkStack top){
 LStackNode *p;
 int count=0;
 p=top;
 while(p->next!=NULL){
  p=p->next;
  count++;
 }
 return count;
}
//销毁链栈操作
void DestroyStack(LinkStack top){
 LStackNode *p,*q;
 p=top;
 while(!p){
  q=p;
  p=p->next;
  free(q);
 }
}
void main_LinkStack(){
 LinkStack S;
 DataType ch[50],e,*p;
 InitStack(&S);
 printf(请输入进栈的字符:
);
 gets(ch);
 p=&ch[0];
 while(*p){
  PushStack(S,*p);
  p++;
 }
 printf(当前栈顶的元素是:);  
 if(GetTop(S,&e)==0){
  printf(栈已空!
);
  return ;
 }else{
  printf(%4c
,e);
 }
 printf(当前栈中的元素个数是:%d
,StackLength(S));
 printf(元素出栈的序列是:);
 while(!StackEmpty(S)){
  PopStack(S,&e);
  printf(%4c,e);
 }
 printf(
);
 system(pause);
}
//********************************
int Match(DataType e,DataType ch){
 if(e=='('&&ch==')')
  return 1;
 else if(e=='['&&ch==']')
  return 1;
 else if(e=='{'&&ch=='}')
  return 1;
 else
  return 0;
}
void main_Match(){
 LinkStack S;
 char *p;
 DataType e;
 DataType ch[100];
 InitStack(&S);
 printf(请输入带括号的表达式('{}','[]','()').
);
 gets(ch);
 p=ch;
 while(*p){
  switch(*p){
  case '(':
  case '[':
  case '{':
   PushStack(S,*p++);
   break;
  case ')':
  case ']':
  case '}':
   if(StackEmpty(S)){
    printf(缺少左括号.
);
    return;
   }else{
    GetTop(S,&e);
    if(Match(e,*p))
     PopStack(S,&e);
    else{
     printf(左右括号不配对.
);
     return;
    }
   }
  default:
   p++;
  }
 }
 if(StackEmpty(S))
  printf(括号匹配.
);
 else
  printf(缺少右括号.
);
 system(pause);
}
//===========
void main(){
 main_LinkStack();
 main_Match();
}

 

http://www.bkjia.com/cjjc/1042805.htmlwww.bkjia.comtruehttp://www.bkjia.com/cjjc/1042805.htmlTechArticle\_DataStructure\_C\_Impl:链栈
//_DataStructure_C_Impl:链栈#include #include typedef char
DataType;typedef struct node{DataType data;struct node
*next;}LStackNode,*LinkStack;//将链…

admin

网站地图xml地图