首页 > 代码库 > 数据结构之顺序栈基本操作SqStack
数据结构之顺序栈基本操作SqStack
顺序栈SqStack
基本操作
1 Status InitStack()//构造一个空栈S2 Status DestroyStack()//销毁栈S,S不再存在3 Status ClearStack()//把S置为空栈4 Status StackEmpty()//若S为空栈,则返回true,否则返回false5 int StackLength()//返回S的元素个数,即栈的长度6 Status GetTop(SElemType &e)//若栈不空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR7 Status Push(SElemType e)//插入元素e为新的栈顶元素8 Status Pop(SElemType &e)//若栈不空,则删除S的栈顶元素,并用e返回其值,并返回OK,否则返回ERROR9 Status StackTraverse(int p)//从栈底到栈顶依次对栈中每个元素调用函数visit().一旦visit()失败则操作失败
几个小程序
1 CheckStackCode();//测试Stack代码正确性2 Conversion();//数制转换3 BracketsMatching();//括号匹配的检验4 LineEdit();//行编辑程序
1 // 2 //by coolxxx 3 //#include<bits/stdc++.h> 4 #include<iostream> 5 #include<algorithm> 6 #include<string> 7 #include<iomanip> 8 #include<map> 9 #include<stack> 10 #include<queue> 11 #include<set> 12 #include<bitset> 13 #include<memory.h> 14 #include<time.h> 15 #include<stdio.h> 16 #include<stdlib.h> 17 #include<string.h> 18 //#include<stdbool.h> 19 #include<math.h> 20 #define min(a,b) ((a)<(b)?(a):(b)) 21 #define max(a,b) ((a)>(b)?(a):(b)) 22 #define abs(a) ((a)>0?(a):(-(a))) 23 #define lowbit(a) (a&(-a)) 24 #define sqr(a) ((a)*(a)) 25 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b)) 26 #define mem(a,b) memset(a,b,sizeof(a)) 27 #define eps (1e-10) 28 #define J 10000 29 #define mod 1000000007 30 #define MAX 0x7f7f7f7f 31 #define PI 3.14159265358979323 32 #pragma comment(linker,"/STACK:1024000000,1024000000") 33 #define N 104 34 35 using namespace std; 36 typedef long long LL; 37 /* 38 double anss; 39 LL aans,sum; 40 int cas,cass; 41 int n,m,lll,ans; 42 */ 43 44 45 const int OK=1; 46 const int ERROR=0; 47 const int INFEASIBLE=-1; 48 const int STACK_INIT_SIZE=100;//存储空间初始分配量 49 const int STACKINCREMENT=10;//存储空间分配增量 50 typedef int Status; 51 typedef int SElemType; 52 53 Status OutputInt(SElemType e); 54 Status OutputChar(SElemType e); 55 typedef struct 56 { 57 SElemType *base;//栈构造之前和销毁之后,base的值为NULL 58 SElemType *top;//栈顶指针 59 int stacksize;//当前已分配的存储空间,以元素为单位 60 61 Status InitStack()//构造一个空栈S 62 { 63 base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); 64 if(!base)exit(OVERFLOW);//存储分配失败 65 top=base; 66 stacksize=STACK_INIT_SIZE; 67 return OK; 68 }//InitStack 69 70 Status DestroyStack()//销毁栈S,S不再存在 71 { 72 free(base); 73 base=NULL; 74 top=NULL; 75 stacksize=0; 76 return OK; 77 }//DestroyStack 78 79 Status ClearStack()//把S置为空栈 80 { 81 top=base; 82 return OK; 83 }//ClearStack 84 85 Status StackEmpty()//若S为空栈,则返回true,否则返回false 86 { 87 if(top==base)return true; 88 return false; 89 }//StackEmpty 90 91 int StackLength()//返回S的元素个数,即栈的长度 92 { 93 return top-base; 94 }//StackLength 95 96 Status GetTop(SElemType &e)//若栈不空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR 97 { 98 if(top==base)return ERROR; 99 e=*(top-1);100 return OK;101 }//GetTop102 103 Status Push(SElemType e)//插入元素e为新的栈顶元素104 {105 if(top-base>=stacksize)//栈满,追加存储空间106 {107 base=(SElemType *)realloc(base,(stacksize+STACKINCREMENT)*sizeof(SElemType));108 if(!base)exit(OVERFLOW);//存储分配失败109 top=base+stacksize;110 stacksize+=STACKINCREMENT;111 }112 (*top++)=e;113 return OK;114 }//Push115 116 Status Pop(SElemType &e)//若栈不空,则删除S的栈顶元素,并用e返回其值,并返回OK,否则返回ERROR117 {118 if(top==base)return ERROR;119 e=(*--top);120 return OK;121 }//Pop122 123 Status StackTraverse(int p)//从栈底到栈顶依次对栈中每个元素调用函数visit().一旦visit()失败则操作失败124 {125 SElemType *i=base;126 Status (*visit)(SElemType);127 if(p==1)visit=OutputInt;128 else if(p==0)visit=OutputChar;129 while(top>i)130 visit(*i++);131 puts("");132 return OK;133 }//StackTraverse134 }SqStack;135 136 Status OutputInt(SElemType e)137 {138 printf("%d ",e);139 return OK;140 }141 Status OutputChar(SElemType e)142 {143 printf("%c",e);144 return OK;145 }146 147 148 void CheckStackCode()149 {150 typedef int SElemType;151 int i;152 SqStack S;153 SElemType e;154 if(S.InitStack()==OK)155 {156 for(i=1;i<=12;i++)157 S.Push(i);158 }159 printf("栈中元素依次为:");160 S.StackTraverse(1);161 S.Pop(e);162 printf("弹出的栈顶元素 e=%d\n",e);163 printf("栈空否:%d(1:空 0:否)\n",S.StackEmpty());164 S.GetTop(e);165 printf("栈顶元素 e=%d 栈的长度为%d\n",e,S.StackLength());166 S.Push(13);167 printf("栈中元素依次为:");168 S.StackTraverse(1);169 S.GetTop(e);170 printf("栈顶元素 e=%d 栈的长度为%d\n",e,S.StackLength());171 S.DestroyStack();172 printf("销毁栈后,S.top=%d S.base=%d S.stacksize=%d\n",S.top,S.base,S.stacksize);173 }174 175 void Conversion()//对于输入的任意一个非负十进制整数n,打印输出与其等值的八进制数176 {177 typedef int SElemType;178 int n;179 SqStack S;180 SElemType e;181 182 S.InitStack();//构造空栈183 scanf("%d",&n);184 while(n)185 {186 S.Push(n%8);187 n/=8;188 }189 while(!S.StackEmpty())190 {191 S.Pop(e);192 printf("%d",e);193 }194 puts("");195 196 S.DestroyStack();197 }198 199 void BracketsMatching()//三种括号()[]{},检验是否合法200 {201 202 char s[N];203 SqStack S;204 SElemType e;205 int i;206 S.InitStack();207 scanf("%s",s);208 209 for(i=0;i<strlen(s);i++)210 {211 if(s[i]==‘(‘ || s[i]==‘{‘ || s[i]==‘[‘)212 S.Push(s[i]);213 else if(s[i]==‘)‘ || s[i]==‘}‘ || s[i]==‘]‘)214 {215 if(S.GetTop(e) && ((e==‘(‘ && s[i]==‘)‘) || (e==‘[‘ && s[i]==‘]‘) || (e==‘{‘ && s[i]==‘}‘)))216 S.Pop(e);217 else218 {219 puts("NO");220 S.DestroyStack();221 return;222 }223 }224 }225 if(S.StackEmpty())puts("YES");226 else puts("NO");227 S.DestroyStack();228 }229 230 void LineEdit()//从终端接收一行并传送至调用过程的数据区,#为退格符,@为退行符231 {232 int i;233 char ch;234 SqStack S;235 SElemType e;236 S.InitStack();237 while(ch!=EOF)238 {239 for(ch=getchar();ch!=EOF && ch!=‘\n‘;ch=getchar())240 {241 if(ch==‘#‘)S.Pop(e);242 else if(ch==‘@‘)S.ClearStack();243 else S.Push(ch);244 }245 S.StackTraverse(0);246 S.ClearStack();247 }248 S.DestroyStack();249 }250 251 252 int main()253 {254 #ifndef ONLINE_JUDGEW255 freopen("1.txt","r",stdin);256 // freopen("2.txt","w",stdout);257 #endif258 int i,j,k;259 // init();260 // for(scanf("%d",&cass);cass;cass--)261 // for(scanf("%d",&cas),cass=1;cass<=cas;cass++)262 // while(~scanf("%s",s))263 /*264 while(~scanf("%d%d",&n,&m))265 {266 267 }268 */269 270 CheckStackCode();//测试Stack代码正确性271 272 Conversion();//数制转换273 274 BracketsMatching();//括号匹配的检验275 276 LineEdit();//行编辑程序277 278 return 0;279 }280 /*281 //282 283 //284 */
数据结构之顺序栈基本操作SqStack
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。