数据结构之顺序栈基本操作SqStack

顺序栈SqStack

基本操作

1 Status InitStack()//构造一个空栈S
2 Status DestroyStack()//销毁栈S,S不再存在
3 Status ClearStack()//把S置为空栈
4 Status StackEmpty()//若S为空栈,则返回true,否则返回false
5 int StackLength()//返回S的元素个数,即栈的长度
6 Status GetTop(SElemType &e)//若栈不空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR
7 Status Push(SElemType e)//插入元素e为新的栈顶元素
8 Status Pop(SElemType &e)//若栈不空,则删除S的栈顶元素,并用e返回其值,并返回OK,否则返回ERROR
9 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     }//GetTop
102
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     }//Push
115
116     Status Pop(SElemType &e)//若栈不空,则删除S的栈顶元素,并用e返回其值,并返回OK,否则返回ERROR
117     {
118         if(top==base)return ERROR;
119         e=(*--top);
120         return OK;
121     }//Pop
122
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     }//StackTraverse
134 }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             else
218             {
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_JUDGEW
255     freopen("1.txt","r",stdin);
256 //    freopen("2.txt","w",stdout);
257     #endif
258     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 */
时间: 2024-10-14 05:06:35

数据结构之顺序栈基本操作SqStack的相关文章

浅谈数据结构之顺序栈(三)

栈:是限定仅在表尾进行插入与删除操作的线性表.我们把允许插入与删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的称为空栈.栈的插入操作,叫作进栈,也叫压栈.入栈,类似于子弹入弹夹:栈的删除操作,叫作出栈,也叫弹栈,如同弹夹中的子弹出夹.注意:栈的定义中的"表尾"指的是"栈顶",而不是"栈底". 首先,栈是一个线性表,也就是说:栈具有线性结构,即前驱后继关系:只不过它是一个特殊的线性表而已,它的特殊之处在于限制了这个线性表的插入与删除位置,它始

【数据结构之顺序栈的基本运算】

//顺序栈 public class OrderStack { //(1)置空栈 void InitStack(SeqStack *S){ S->top = -1; } //(2)判断栈空 int StackEmpty(SeqStack *S){ return S->top == -1; } //(3)判断栈满 int StackFull(SeqStack *S){ return S->top == StackSize-1; } //(4)进栈 void push(S,x){ if(St

数据结构之顺序栈(C++版)

#include <iostream>#include <stdlib.h>#define MAXLISTSIZE 100 //预设的存储空间最大容量using namespace std; typedef string ElemType;typedef struct{ ElemType *base; //存储空间基址 int top; //栈顶指针 int stacksize; //允许的最大存储空间以元素为单位}Stack; void InitStack(Stack &

数据结构库——顺序栈的概念及实现

1,栈的定义: 1,栈是一种特殊的线性表: 2,栈仅能在线性表的一端进行操作: 1,栈顶(Top):允许操作的一端: 2,栈底(Bottom):不允许操作的一端: 2,栈的特性: 1,后进先出(Last In First Out)(只有一个特性): 3,栈的操作(创销进出顶大清): 1,创建栈(Stack()): 2,销毁栈(~Stack()): 3,进栈(push()): 4,出栈(pop()): 5,获取栈顶元素(top()): 6,获取栈的大小(size()): 7,清空栈(clear()

数据结构:顺序栈

这是严蔚敏吴伟民版本的算法,感觉没<大话数据结构>里面的简单易懂 这个版本里面的top指针指向下一个空单元格,这个其实是有些问题的,因为栈满的时候,top是指向栈外的,有些不安全. 1 #ifndef SQ_STACK_HEAD 2 #define SQ_STACK_HEAD 3 #include <stdio.h> 4 #include <stdlib.h> 5 #define Status int 6 #define OVERFLOW -1 7 #define OK

【数据结构】顺序栈的实现(c++)

头文件: #pragma once #include <iostream> #include <assert.h> using namespace std; template<class Type> class SeqStack { public: SeqStack(size_t sz = INIT_SZ); ~SeqStack(); public: bool empty()const; bool full()const; void show()const; bool

C++顺序栈基本操作

1 #include <iostream> 2 #define STACKSIZE 50/*设栈中元素个数为50个*/ 3 using namespace std; 4 5 struct SeqStack 6 { 7 int elem[STACKSIZE]; 8 int top; 9 }; 10 11 /*构造一个空栈*/ 12 void InitStack(SeqStack *S) 13 { 14 S->top=-1; 15 } 16 17 /*将x置入S栈新栈顶*/ 18 bool

【数据结构】顺序栈

#include <STDIO.H> #include <STRING.H> #include <STDLIB.H> typedef struct SeqStack { int length; int top; char *data; }seqstack; seqstack* CreatStack(seqstack *s,int n) { s=(seqstack *)malloc(sizeof(seqstack)+n*sizeof(char)); if(s==NULL)

看数据结构写代码(8)顺序栈的实现

欢迎指出 代码 不足之处 在写顺序栈的时候 犯了两个错误,:一个是 对栈的 认识不够清楚,栈顶指针的下一个位置为栈顶元素: 另一个是粗心,在用 realloc 分配内存的时候,忽略了元素本身的大小,只写了 元素的个数. 希望引以为戒. 上代码: // SqStack.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdlib.h> #include <cstdio> //故意将值设置的比较小,以测试