当前位置:网站首页>C language - stack
C language - stack
2022-07-04 10:24:00 【sqjddb】
Definition of stack
Stack (stack) Also known as the stack , It's a limitation Insert and delete only at the end of the table Operation of the The linear table
This end is called To the top of the stack , The other end is called At the bottom of the stack . The data elements in the stack comply with Last in, first out Principles .
To a stack Insert The new element is also called Into the stack 、 Push or push , Make it the new top element
From a stack Delete Elements are also called Out of stack or out of stack .
C Language implementation stack
analysis :
You can use arrays or linked lists to achieve , But the cost of inserting data into the tail of the array is relatively small . The complete procedure is as follows :
The header file
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#include<assert.h>
typedef int STDatatype;
typedef struct Stack
{
STDatatype* p;
int top;
int capacity;
}ST;
// Initialization stack
void StackInit(ST* ps);
// Free up stack space
void StackDestroy(ST* ps);
// Element stack
void StackPush(ST* ps, STDatatype x);
// Out of the stack
void StackPop(ST* ps);
// Sentenced to empty
bool StackEmpty(ST* ps);
// Calculate the number of elements in the stack
int StackSize(ST* ps);
// Back to top of stack element
STDatatype StackTop(ST* ps);
Function implementation file
#include "Stack.h"
void StackInit(ST* ps)
{
assert(ps);
ps->p = NULL;
ps->top = 0;
ps->capacity = 0;
}
void StackDestroy(ST* ps)
{
assert(ps);
if (ps->p)// If p by NULL, Can not be free
{
free(ps->p);
}
ps->p= NULL; //free After the empty , Avoid wild pointer problems
ps->top = 0;
ps->capacity = 0;
}
void StackPush(ST* ps, STDatatype x)
{
assert(ps);
// Check if there's enough space , Not enough capacity
if (ps->top == ps->capacity)
{
int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
STDatatype* tmp = realloc(ps->p, sizeof(STDatatype)*newcapacity);
ps->p= tmp;
ps->capacity = newcapacity;
}
ps->p[ps->top] = x;
ps->top++;
}
bool StackEmpty(ST* ps)
{
assert(ps);
return ps->top == 0;
}
void StackPop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
ps->top--;//-> Priority over --
}
int StackSize(ST* ps)
{
assert(ps);
return ps->top;
}
STDatatype StackTop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
return ps->p[ps->top - 1];
}
Main function test file
#include "Stack.h"
int main()
{
ST st;
StackInit(&st);
StackPush(&st, 1);
StackPush(&st, 2);
StackPush(&st, 3);
printf("%d ", StackTop(&st));
StackPop(&st);
printf("%d ", StackTop(&st));
StackPop(&st);
StackPush(&st, 4);
StackPush(&st, 5);
while (!StackEmpty(&st))
{
printf("%d ", StackTop(&st));
StackPop(&st);
}
printf("\n");
StackDestroy(&st);
return 0;
}
Running results 
Classical bracket matching problem


Ideas
Traversal string , If the current character is an open parenthesis , Push , Wait for the right parenthesis to determine whether it matches , If it's right bracket , Match the character at the top of the stack with the current character , Stack top element out of stack , Make the character at the top of the stack become an earlier left parenthesis , It is convenient to match with the more backward right parenthesis . Specific ideas and details are shown in the following program notes
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#include<assert.h>
// First, implement a stack
typedef int STDatatype;
typedef struct Stack
{
STDatatype* p;
int top;
int capacity;
}ST;
void StackPush(ST* ps, STDatatype x)
{
assert(ps);
// Check if there's enough space , Not enough capacity
if (ps->top == ps->capacity)
{
int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
STDatatype* tmp = realloc(ps->p, sizeof(STDatatype)*newcapacity);
ps->p = tmp;
ps->capacity = newcapacity;
}
ps->p[ps->top] = x;
ps->top++;
}
void StackInit(ST* ps)
{
assert(ps);
ps->p = NULL;
ps->top = 0;
ps->capacity = 0;
}
void StackDestroy(ST* ps)
{
assert(ps);
if (ps->p)// If p by NULL, Can not be free
{
free(ps->p);
}
ps->p = NULL; //free After the empty , Avoid wild pointer problems
ps->top = 0;
ps->capacity = 0;
}
bool StackEmpty(ST* ps)
{
assert(ps);
return ps->top == 0;
}
void StackPop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
ps->top--;//-> Priority over --
}
STDatatype StackTop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
return ps->p[ps->top - 1];
}
bool isValid(char * s){
ST st;
StackInit(&st);
bool matchflag = true;
while (*s)
{
if (*s == '{' || *s == '[' || *s == '(')
{
StackPush(&st, *s);// If it's left parenthesis , Push
s++;
}
else
{
// The program comes to this , The current character is the right bracket
// If there are no elements in the stack , Indicates that there is no left parenthesis matching the current right parenthesis
if (StackEmpty(&st))
{
matchflag = false;
break;
}
// If there are elements in the stack , Take it out to match the current right parenthesis
char ch = StackTop(&st);
// The matched left parenthesis should be out of the stack
StackPop(&st);
// See if it matches
if (
(*s == '}'&&ch != '{') ||
(*s == ']'&&ch != '[') ||
(*s == ')'&&ch != '(')
)
{
matchflag = false;
break;
}
else
{
s++;// If the match , Continue traversing backwards
// See whether the following right parenthesis matches the element at the top of the stack
// It makes perfect use of the characteristics of stack first in and last out
}
}
}
if (matchflag == true)
{
matchflag = StackEmpty(&st);
// If the characters are traversed and the stack is not empty , It shows that the left parenthesis in the stack is lonely , Mismatch
}
StackDestroy(&st);
return matchflag;
}
int main()
{
// Test several examples
char *p0 = "{[]}";
printf("%d\n", isValid(p0));
char *p1= "()";
printf("%d\n", isValid(p1));
char *p2 = "()[]{}";
printf("%d\n", isValid(p2));
char *p3 = "(]";
printf("%d\n", isValid(p3));
char *p4 = "([)]";
printf("%d\n", isValid(p4));
}
Running results :
边栏推荐
- System.currentTimeMillis() 和 System.nanoTime() 哪个更快?别用错了!
- MySQL case
- Exercise 7-2 finding the maximum value and its subscript (20 points)
- 对于程序员来说,伤害力度最大的话。。。
- Golang defer
- Differences among opencv versions
- A little feeling
- Si vous ne connaissez pas ces quatre modes de mise en cache, vous osez dire que vous connaissez la mise en cache?
- DDL statement of MySQL Foundation
- OSPF comprehensive experiment
猜你喜欢

Rhcsa day 9
Si vous ne connaissez pas ces quatre modes de mise en cache, vous osez dire que vous connaissez la mise en cache?

入职中国平安三周年的一些总结

BGP advanced experiment

Vs201 solution to failure to open source file HPP (or link library file)

Some summaries of the third anniversary of joining Ping An in China

Custom type: structure, enumeration, union

Dynamic address book

Today's sleep quality record 78 points

Reasons and solutions for the 8-hour difference in mongodb data date display
随机推荐
【Day1】 deep-learning-basics
Hands on deep learning (42) -- bi-directional recurrent neural network (BI RNN)
AUTOSAR从入门到精通100讲(106)-域控制器中的SOA
Doris / Clickhouse / Hudi, a phased summary in June
2021-08-11 function pointer
Safety reinforcement learning based on linear function approximation safe RL with linear function approximation translation 2
uniapp---初步使用websocket(长链接实现)
Exercise 9-3 plane vector addition (15 points)
Press the button wizard to learn how to fight monsters - identify the map, run the map, enter the gang and identify NPC
If the uniapp is less than 1000, it will be displayed according to the original number. If the number exceeds 1000, it will be converted into 10w+ 1.3k+ display
Native div has editing ability
system design
C language pointer classic interview question - the first bullet
Deep learning 500 questions
Evolution from monomer architecture to microservice architecture
对于程序员来说,伤害力度最大的话。。。
Delayed message center design
Hands on deep learning (41) -- Deep recurrent neural network (deep RNN)
DDL statement of MySQL Foundation
SQL replying to comments